كيف أقوم بترحيل مستودع SVN مع السجل إلى مستودع Git جديد؟
-
09-06-2019 - |
سؤال
لقد قرأت دليل Git، والأسئلة الشائعة، ودورة Git - SVN المكثفة، وما إلى ذلك.وجميعهم يشرحون هذا وذاك، ولكن لا يمكنك العثور في أي مكان على تعليمات بسيطة مثل:
مستودع SVN في: svn://myserver/path/to/svn/repos
مستودع Git في: git://myserver/path/to/git/repos
git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos
لا أتوقع أن يكون الأمر بهذه البساطة، ولا أتوقع أن يكون أمرًا واحدًا.لكنني أتوقع ألا يحاول شرح أي شيء - فقط أن أقول ما هي الخطوات التي يجب اتخاذها في هذا المثال.
المحلول
سحر:
$ git svn clone http://svn/repo/here/trunk
يعمل كل من Git وSVN بشكل مختلف تمامًا.أنت بحاجة إلى تعلم Git، وإذا كنت تريد تتبع التغييرات من SVN إلى المنبع، فأنت بحاجة إلى التعلم git-svn
.ال git-svn
تحتوي صفحة الرجل على قسم أمثلة جيدة:
$ git svn --help
نصائح أخرى
قم بإنشاء ملف مستخدمين (أي. users.txt
) لتعيين مستخدمي SVN إلى Git:
user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...
يمكنك استخدام هذا السطر لإنشاء قالب من مستودع SVN الموجود لديك:
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt
سيتوقف SVN إذا عثر على مستخدم SVN مفقود غير موجود في الملف.ولكن بعد ذلك يمكنك تحديث الملف والمتابعة من حيث توقفت.
الآن اسحب بيانات SVN من المستودع:
git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp
سيؤدي هذا الأمر إلى إنشاء مستودع Git جديد فيه dest_dir-tmp
وابدأ في سحب مستودع SVN.لاحظ أن علامة "--stdlayout" تشير إلى أن لديك تخطيط SVN "trunk/، Branchs/،tags/" الشائع.إذا كان تخطيطك مختلفًا، فتعرف عليه --tags
, --branches
, --trunk
الخيارات (بشكل عام git svn help
).
يُسمح بجميع البروتوكولات الشائعة: svn://
, http://
, https://
.يجب أن يستهدف عنوان URL المستودع الأساسي، مثل http://svn.mycompany.com/myrepo/repository.لا بد منه لا يشمل /trunk
, /tag
أو /branches
.
لاحظ أنه بعد تنفيذ هذا الأمر، غالبًا ما يبدو أن العملية "معلقة/مجمدة"، ومن الطبيعي جدًا أن تظل عالقة لفترة طويلة بعد تهيئة المستودع الجديد.وفي نهاية المطاف، ستشاهد رسائل السجل التي تشير إلى أنه يتم الترحيل.
لاحظ أيضًا أنه إذا قمت بحذف --no-metadata
العلم، سيقوم Git بإلحاق معلومات حول مراجعة SVN المقابلة لرسالة الالتزام (أي. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>
)
إذا لم يتم العثور على اسم مستخدم، قم بتحديث ملفك users.txt
الملف ثم:
cd dest_dir-tmp
git svn fetch
قد تضطر إلى تكرار الأمر الأخير عدة مرات، إذا كان لديك مشروع كبير، حتى يتم جلب كافة التزامات التخريب:
git svn fetch
عند الانتهاء، سيقوم Git بفحص SVN trunk
إلى فرع جديد.يتم إعداد أي فروع أخرى كأجهزة تحكم عن بعد.يمكنك عرض فروع SVN الأخرى باستخدام:
git branch -r
إذا كنت تريد الاحتفاظ بالفروع البعيدة الأخرى في المستودع الخاص بك، فأنت تريد إنشاء فرع محلي لكل فرع يدويًا.(تخطي الجذع/الرئيسي.) إذا لم تقم بذلك، فلن يتم استنساخ الفروع في الخطوة الأخيرة.
git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name
يتم استيراد العلامات كفروع.يجب عليك إنشاء فرع محلي وإنشاء علامة وحذف الفرع لجعلها علامات في Git.للقيام بذلك باستخدام العلامة "v1":
git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1
انسخ مستودع GIT-SVN الخاص بك إلى مستودع Git نظيف:
git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir
سيتم نسخ الفروع المحلية التي قمت بإنشائها مسبقًا من الفروع البعيدة فقط كفروع بعيدة في المستودع المستنسخ الجديد.(تخطي الجذع/الرئيسي.) لكل فرع تريد الاحتفاظ به:
git checkout -b local_branch origin/remote_branch
أخيرًا، قم بإزالة جهاز التحكم عن بعد من مستودع Git النظيف الذي يشير إلى المستودع المؤقت المحذوف الآن:
git remote rm origin
قم بترحيل مستودع التخريب الخاص بك بشكل نظيف إلى مستودع Git.عليك أولاً إنشاء ملف يقوم بتعيين أسماء مؤلفي التزام Subversion لملتزمي Git، على سبيل المثال ~/authors.txt
:
jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>
بعد ذلك يمكنك تنزيل بيانات Subversion إلى مستودع Git:
mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch
إذا كنت تستخدم جهاز Mac، فيمكنك الحصول عليه git-svn
من MacPorts عن طريق التثبيت git-core +svn
.
إذا كان مستودع التخريب الخاص بك على نفس الجهاز مثل مستودع GIT المطلوب ، فيمكنك استخدام هذا الجملة لخطوة init ، وإلا كلها:
git svn init file:///home/user/repoName --no-metadata
لقد استخدمت البرنامج النصي svn2git ويعمل مثل السحر.
أقترح أن تشعر بالراحة مع Git قبل محاولة استخدام git-svn باستمرار، أي.الاحتفاظ بـ SVN باعتباره الريبو المركزي واستخدام Git محليًا.
ومع ذلك، لإجراء عملية ترحيل بسيطة بكل السجل، إليك بعض الخطوات البسيطة:
تهيئة الريبو المحلي:
mkdir project
cd project
git svn init http://svn.url
حدد المدة التي تريد بدء استيراد المراجعات فيها:
git svn fetch -r42
(أو فقط "git svn fetch" لجميع الدورات)
في الواقع جلب كل شيء منذ ذلك الحين:
git svn rebase
يمكنك التحقق من نتيجة الاستيراد باستخدام Gitk.لست متأكدًا مما إذا كان هذا يعمل على نظام التشغيل Windows، أم أنه يعمل على OSX وLinux:
gitk
عندما يتم استنساخ SVN repo محليًا، قد ترغب في دفعه إلى Git repo مركزي لتسهيل التعاون.
قم أولاً بإنشاء الريبو البعيد الفارغ (ربما قيد التشغيل جيثب?):
git remote add origin git@github.com:user/project-name.git
بعد ذلك، قم بمزامنة فرعك الرئيسي بشكل اختياري بحيث تقوم عملية السحب تلقائيًا بدمج الفرع الرئيسي البعيد مع فرعك الرئيسي المحلي، عندما يحتوي كلاهما على أشياء جديدة:
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
بعد ذلك، قد تكون مهتمًا بتجربة منتجي الخاص git_remote_branch
الأداة التي تساعد في التعامل مع الفروع البعيدة:
المشاركة التوضيحية الأولى:"جيت الفروع البعيدة"
متابعة للإصدار الأحدث:"حان الوقت للتعاون مع git_remote_branch"
يوجد حل جديد للانتقال السلس من Subversion إلى Git (أو لاستخدام كليهما في وقت واحد): فرعية.
أنا أعمل على هذا المشروع بنفسي.نحن نستخدم SubGit في مستودعاتنا - بعض زملائي في الفريق يستخدمون Git والبعض الآخر Subversion ويعمل بشكل جيد جدًا حتى الآن.
للترحيل من Subversion إلى Git باستخدام SubGit، يلزمك تشغيل:
$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL
بعد ذلك، ستحصل على مستودع Git في svn_repos/.git ويمكنك استنساخه، أو الاستمرار في استخدام Subversion ومستودع Git الجديد معًا:سيتأكد SubGit من مزامنة كلاهما دائمًا.
في حالة احتواء مستودع Subversion الخاص بك على مشاريع متعددة، فسيتم إنشاء مستودعات Git متعددة في دليل svn_repos/git.لتخصيص الترجمة قبل تشغيلها قم بما يلي:
$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos
مع فرعية يمكنك الانتقال إلى Git النقي (وليس git-svn) والبدء في استخدامه مع الاحتفاظ بـ Subversion طالما كنت في حاجة إليه (على سبيل المثال، لأدوات البناء التي تم تكوينها بالفعل).
أتمنى أن يساعدك هذا!
شاهد المسؤول صفحة git-svn.على وجه الخصوص، انظر ضمن "الأمثلة الأساسية":
التتبع والمساهمة في مشروع يديره التخريب بالكامل (كاملة مع الجذع والعلامات والفروع):
# Clone a repo (like git clone):
git svn clone http://svn.foo.org/project -T trunk -b branches -t tags
يشرح Pro Git 8.2 ذلك:http://git-scm.com/book/en/Git-and-Other-Systems-Migrate-to-Git
فرعية (مقابل شاشة الموت الزرقاء)
subgit import --svn-url url://svn.serv/Bla/Bla directory/path/Local.git.Repo
كل شيء.
+ للتحديث من SVN، تم إنشاء مستودع Git بواسطة الأمر الأول.
subgit import directory/path/Local.git.Repo
لقد استخدمت طريقة للانتقال إلى Git على الفور للحصول على مستودع ضخم.
بالطبع تحتاج إلى بعض التحضير.
لكن لا يجوز لك إيقاف عملية التطوير على الإطلاق.
هنا طريقي.
يبدو الحل الخاص بي كما يلي:
- قم بترحيل SVN إلى مستودع Git
- قم بتحديث مستودع Git قبل انتقال الفريق إليه مباشرةً.
يستغرق الترحيل الكثير من الوقت لمستودع SVN الكبير.
لكن تحديث عملية الترحيل المكتملة لا يستغرق سوى ثوانٍ.
بالطبع أنا أستخدم فرعية, ماما.git-svn يجعلني شاشة الموت الزرقاء.فقط باستمرار.و git-svn يشعرني بالملل مع Git "اسم الملف طويل جدًا"خطأ فادح.
خطوات
1. تحميل SubGit
2. إعداد أوامر الترحيل والتحديث.
لنفترض أننا نفعل ذلك لنظام التشغيل Windows (من السهل النقل إلى Linux).
في تثبيت SubGit سلة مهملات الدليل (subgit-2.X.X\bin)، قم بإنشاء ملفين .bat.
محتوى الملف/الأمر الخاص بالترحيل:
start subgit import --svn-url url://svn.serv/Bla/Bla directory/path/Local.git.Repo
أمر "البدء" اختياري هنا (Windows).سيسمح برؤية الأخطاء عند البداية وترك الصدفة مفتوحة بعد الانتهاء من SubGit.
يمكنك الإضافة هنا معلمات إضافية مشابهة لـ git-svn.أنا أستخدم فقط --النطاق الافتراضي myCompanyDomain.com لإصلاح مجال عنوان البريد الإلكتروني لمؤلفي SVN.
لدي بنية مستودع SVN القياسية (الجذع/الفروع/العلامات) ولم نواجه مشاكل في "تعيين المؤلفين".لذلك أنا لا أفعل شيئا بعد الآن.
(إذا كنت تريد ترحيل العلامات مثل الفروع أو أن SVN الخاص بك يحتوي على مجلدات فروع/علامات متعددة، فقد تفكر في استخدام SubGit الأكثر تفصيلاً يقترب)
نصيحة 1:استخدم --minimal-revision YourSvnRevNumber لترى بسرعة كيف تغلي الأمور (نوع من التصحيح).من المفيد بشكل خاص رؤية أسماء المؤلفين أو رسائل البريد الإلكتروني التي تم حلها.
أو للحد من عمق تاريخ الهجرة.
نصيحة 2:قد تتم مقاطعة الهجرة (كنترول + ج) واستعادتها عن طريق تشغيل أمر/ملف التحديث التالي.
لا أنصح بالقيام بذلك للمستودعات الكبيرة.لقد تلقيت "نفاد الذاكرة استثناء Java + Windows".
نصيحة 3:من الأفضل إنشاء نسخة من مستودع النتائج الخاص بك.
محتوى الملف/الأمر للتحديث:
start subgit import directory/path/Local.git.Repo
يمكنك تشغيله في أي عدد من المرات عندما تريد الحصول على التزامات الفريق الأخير في مستودع Git الخاص بك.
تحذير! لا تلمس مستودعك المجرد (إنشاء الفروع على سبيل المثال).
سترتكب الخطأ الفادح التالي:
خطأ غير قابل للإصلاح:غير متزامنة ولا يمكن مزامنتها ...ترجمة مراجعات التخريب إلى Git تلتزم...
3. قم بتشغيل الأمر/الملف الأول.سيستغرق الأمر وقتًا طويلاً لإنشاء مستودع كبير.30 ساعة لمستودعي المتواضع.
كل شيء.
يمكنك تحديث مستودع Git الخاص بك من SVN في أي وقت وأي عدد من المرات عن طريق تشغيل الملف/الأمر الثاني.وقبل تحويل فريق التطوير الخاص بك إلى Git.
سوف يستغرق ثواني فقط.
هناك مهمة أخرى مفيدة.
ادفع مستودع Git المحلي الخاص بك إلى مستودع Git البعيد
هل هي قضيتك؟دعونا نمضي قدما.
- تكوين أجهزة التحكم عن بعد الخاصة بك
يجري:
$ git remote add origin url://your/repo.git
- استعد للإرسال الأولي لمستودع Git المحلي الضخم الخاص بك إلى مستودع بعيد
افتراضيًا، لا يستطيع Git إرسال أجزاء كبيرة.مميت:الطرف البعيد انهى الاتصال بصورة مفاجئة
فلنركض من أجل ذلك:
git config --global http.postBuffer 1073741824
524288000 - 500 MB 1073741824 - 1 غيغابايت ، إلخ.
إصلاح المحلية الخاصة بك مشاكل الشهادة.إذا كان خادم git الخاص بك يستخدم شهادة مكسورة.
لقد تعطيل شهادات.
قد يحتوي خادم Git أيضًا على ملف طلب قيود المبلغ التي تحتاج إلى تصحيح.
- دفع كل الهجرة إلى مستودع Git البعيد الخاص بالفريق.
التشغيل باستخدام Git المحلي:
git push origin --mirror
(أصل دفع بوابة '*:*' لإصدارات Git القديمة)
إذا حصلت على ما يلي: خطأ:لا يمكن أن تفرخ بوابة:لا يوجد ملف او مجلد...بالنسبة لي، فإن إعادة الإنشاء الكامل لمستودعي يحل هذا الخطأ (30 ساعة).يمكنك تجربة الأوامر التالية
git push origin --all
git push origin --tags
أو حاول أن أعد تثبيت جيت (عديمة الفائدة بالنسبة لي).أو يمكنك إنشاء فروع من كل العلامات التي قمت بوضعها ودفعها.أو، أو، أو...
com.reposurgeon
في الحالات المعقدة، يمكن إعادة الجراحة بواسطة إريك س.ريمون هي أداة الاختيار.بالإضافة إلى SVN، فهو يدعم العديد من أنظمة التحكم في الإصدار الأخرى عبر fast-export
التنسيق، وأيضا CVS.يذكر المؤلف التحويلات الناجحة للمستودعات القديمة مثل ايماكس و فري بي إس دي.
الأداة على ما يبدو يهدف إلى تحويل شبه مثالي (مثل تحويل ملفات SVN svn:ignore
خصائص ل .gitignore
files) حتى بالنسبة لتخطيطات المستودعات الصعبة ذات التاريخ الطويل.في العديد من الحالات، قد تكون الأدوات الأخرى أسهل في الاستخدام.
قبل الخوض في توثيق reposurgeon
سطر الأوامر، تأكد من قراءة ممتازة دليل ترحيل DVCS والذي يمر عبر عملية التحويل خطوة بخطوة.
يعد هذا الدليل الموجود على موقع atlassian واحدًا من أفضل ما وجدته:
https://www.atlassian.com/git/migration
هذه الأداة - https://bitbucket.org/atlassian/svn-migration-scripts - يعد أيضًا مفيدًا جدًا لإنشاء ملف Authors.txt الخاص بك من بين أشياء أخرى.
عليك التثبيت
git
git-svn
منسوخ من هذا الرابط http://john.albin.net/git/convert-subversion-to-git.
1.استرجع قائمة بجميع مرتكبي التخريب
يسرد Subversion ببساطة اسم المستخدم لكل التزام.تحتوي التزامات Git على بيانات أكثر ثراءً، ولكن في أبسط الأحوال، يحتاج مؤلف الالتزام إلى إدراج اسم وبريد إلكتروني.افتراضيًا، ستقوم أداة git-svn بإدراج اسم مستخدم SVN في حقلي المؤلف والبريد الإلكتروني.ولكن مع القليل من العمل، يمكنك إنشاء قائمة بجميع مستخدمي SVN وما هو اسم Git وعناوين البريد الإلكتروني المقابلة لهم.يمكن استخدام هذه القائمة بواسطة git-svn لتحويل أسماء مستخدمي svn العادية إلى مُرسِلي Git المناسبين.
من جذر الخروج من Subversion المحلي لديك، قم بتشغيل هذا الأمر:
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
سيؤدي ذلك إلى انتزاع جميع رسائل السجل، وإزالة أسماء المستخدمين، وإزالة أي أسماء مستخدمين مكررة، وفرز أسماء المستخدمين ووضعها في ملف "authors-transform.txt".الآن قم بتحرير كل سطر في الملف.على سبيل المثال، تحويل:
jwilkins = jwilkins <jwilkins>
في هذا:
jwilkins = John Albin Wilkins <johnalbin@example.com>
2.قم باستنساخ مستودع Subversion باستخدام git-svn
git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp
سيؤدي هذا إلى إجراء تحويل git-svn القياسي (باستخدام ملف Authors-transform.txt الذي قمت بإنشائه في الخطوة 1) ووضع مستودع git في المجلد "~/temp" داخل الدليل الرئيسي لديك.
3.تحويل خصائص svn:تجاهل إلى .gitignore
إذا كان svn repo الخاص بك يستخدم خصائص svn:ignore، فيمكنك بسهولة تحويل هذا إلى ملف .gitignore باستخدام:
cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'
4.ادفع المستودع إلى مستودع git العاري
أولاً، أنشئ مستودعًا مجردًا واجعل فرعه الافتراضي يطابق اسم فرع "الجذع" الخاص بـ svn.
git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk
ثم ادفع المستودع المؤقت إلى المستودع العاري الجديد.
cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare
يمكنك الآن حذف مستودع ~/temp بأمان.
5.إعادة تسمية فرع "الجذع" إلى "الرئيسي"
سيتم تسمية فرع التطوير الرئيسي الخاص بك باسم "trunk" وهو ما يطابق الاسم الذي كان عليه في Subversion.ستحتاج إلى إعادة تسميته إلى الفرع "الرئيسي" القياسي لـ Git باستخدام:
cd ~/new-bare.git
git branch -m trunk master
6.تنظيف الفروع والعلامات
يقوم git-svn بتحويل جميع علامات Subversions إلى فروع قصيرة جدًا في Git على شكل "tags/name".ستحتاج إلى تحويل كل هذه الفروع إلى علامات Git فعلية باستخدام:
cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
git tag "$ref" "refs/heads/tags/$ref";
git branch -D "tags/$ref";
done
ستستغرق هذه الخطوة القليل من الكتابة.:-) لكن لا تقلق؛سيوفر غلاف Unix الخاص بك مطالبة ثانوية للأمر الطويل جدًا الذي يبدأ بـ git for-each-ref.
لدى GitHub الآن ميزة الاستيراد من مستودع SVN.لم أحاول ذلك قط، رغم ذلك.
إجابة موسعة إلى حد ما باستخدام git وSVN وbash فقط.يتضمن خطوات لمستودعات SVN التي لا تستخدم التخطيط التقليدي مع تخطيط دليل الجذع/الفروع/العلامات (SVN لا يفعل شيئًا على الإطلاق لفرض هذا النوع من التخطيط).
استخدم أولاً برنامج bash النصي هذا لفحص مستودع SVN الخاص بك بحثًا عن الأشخاص المختلفين الذين ساهموا ولإنشاء قالب لملف التعيين:
#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
echo "${author} = NAME <USER@DOMAIN>";
done
استخدم هذا لإنشاء authors
الملف الذي تقوم فيه بتعيين أسماء مستخدمي svn لأسماء المستخدمين والبريد الإلكتروني كما حددها المطورون لديك باستخدام git config
ملكيات user.name
و user.email
(لاحظ أنه بالنسبة لخدمة مثل GitHub، يكفي فقط وجود بريد إلكتروني مطابق).
ثم يكون git svn
انسخ مستودع svn إلى مستودع git، وأخبره عن التعيين:
git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot
يمكن أن يستغرق هذا وقتًا طويلاً للغاية، نظرًا لأن git svn سيقوم بشكل فردي بفحص كل مراجعة لكل علامة أو فرع موجود.(لاحظ أن العلامات الموجودة في SVN هي مجرد فروع، لذا ينتهي بها الأمر على هذا النحو في Git).يمكنك تسريع ذلك عن طريق إزالة العلامات والفروع القديمة في SVN التي لا تحتاج إليها.
تشغيل هذا على خادم في نفس الشبكة أو على نفس الخادم يمكن أن يؤدي أيضًا إلى تسريع هذا الأمر.وأيضًا، إذا تمت مقاطعة هذه العملية لسبب ما يستطيع استئنافه باستخدام
git svn rebase --continue
في كثير من الحالات، لقد انتهيت هنا.ولكن إذا كان مستودع SVN الخاص بك يحتوي على تخطيط غير تقليدي حيث يكون لديك ببساطة دليل في SVN تريد وضعه في فرع git، فيمكنك القيام ببعض الخطوات الإضافية.
أبسطها هو إنشاء مستودع SVN جديد على الخادم الخاص بك والذي يتبع التقليد والاستخدام svn copy
لوضع الدليل الخاص بك في الجذع أو فرع.قد تكون هذه هي الطريقة الوحيدة إذا كان الدليل الخاص بك موجودًا في جذر الريبو، عندما حاولت ذلك آخر مرة git svn
ببساطة رفض القيام بالخروج.
يمكنك أيضًا القيام بذلك باستخدام git.ل git svn clone
ما عليك سوى استخدام الدليل الذي تريد وضعه في فرع git.
بعد التشغيل
git branch --set-upstream master git-svn
git svn rebase
لاحظ أن هذا يتطلب Git 1.7 أو أعلى.
لقد قمت بنشر دليل خطوة بخطوة (هنا) لتحويل svn إلى git بما في ذلك تحويل علامات svn إلى علامات git وفروع svn إلى فروع git.
نسخة مختصرة:
1) استنساخ svn من رقم مراجعة محدد.(يجب أن يكون رقم المراجعة هو الأقدم الذي تريد ترحيله)
git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame
2) جلب بيانات svn.هذه الخطوة هي التي تستغرق معظم الوقت.
cd gitreponame
git svn fetch
كرر جلب git svn حتى ينتهي بدون أخطاء
3) الحصول على تحديث الفرع الرئيسي
git svn rebase
4) إنشاء فروع محلية من فروع svn عن طريق نسخ المراجع
cp .git/refs/remotes/origin/* .git/refs/heads/
5) تحويل علامات svn إلى علامات git
git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done
6) ضع مستودعًا في مكان أفضل مثل جيثب
git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo
إذا كنت تريد المزيد من التفاصيل، اقرأ بلدي بريد أو تسألني.
يمكننا ان نستخدم git svn clone
الأوامر على النحو التالي.
svn log -q <SVN_URL> | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt
سيقوم الأمر أعلاه بإنشاء ملف المؤلفين من التزامات SVN.
svn log --stop-on-copy <SVN_URL>
سيعطيك الأمر أعلاه رقم المراجعة الأول عند إنشاء مشروع SVN الخاص بك.
git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>
سيقوم الأمر أعلاه بإنشاء مستودع Git باللغة المحلية.
المشكلة هي أنها لن تقوم بتحويل الفروع والعلامات للدفع.سيكون عليك القيام بها يدويًا.على سبيل المثال أدناه للفروع:
$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
remotes/origin/MyDevBranch
remotes/origin/tags/MyDevBranch-1.0
remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
master
remotes/origin/MyDevBranch
remotes/origin/tags/MyDevBranch-1.0
remotes/origin/trunk
$
للعلامات:
$git checkout origin/tags/MyDevBranch-1.0
Note: checking out 'origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from origin/tags/MyDevBranch-1.0)
MyDevBranch
master
remotes/origin/MyDevBranch
remotes/origin/tags/MyDevBranch-1.0
remotes/origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$
الآن ادفع السيد والفروع والعلامات إلى مستودع git البعيد.
$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
* [new branch] master -> master
* [new branch] MyDevBranch -> MyDevBranch
* [new tag] MyDevBranch-1.0 -> MyDevBranch-1.0
$
الأداة المساعدة svn2git
svn2git تقوم الأداة المساعدة بإزالة الجهود اليدوية باستخدام الفروع والعلامات.
تثبيته باستخدام الأمر sudo gem install svn2git
.بعد ذلك قم بتشغيل الأمر أدناه.
$ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>
يمكنك الآن سرد الفروع والعلامات ودفعها بسهولة.
$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
MyDevBranch
* master
remotes/svn/MyDevBranch
remotes/svn/trunk
$ git tag
MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0
تخيل أن لديك 20 فرعًا وعلامة، ومن الواضح أن svn2git سيوفر لك الكثير من الوقت ولهذا السبب أحبه أكثر من الأوامر الأصلية.إنه غلاف جميل حول السكان الأصليين git svn clone
يأمر.
للحصول على مثال كامل، راجع بلدي دخول بلوق.
تقوم TortoiseGit بذلك.راجع مشاركة المدونة هذه: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients
نعم، أعلم أن الإجابة بالروابط ليست رائعة ولكنها حل، أليس كذلك؟
أوصي بشدة بهذا سلسلة قصيرة من تسجيلات الشاشة لقد اكتشفت للتو.يرشدك المؤلف خلال العمليات الأساسية، ويعرض بعض الاستخدامات الأكثر تقدمًا.
إذا كنت تستخدم SourceTree، فيمكنك القيام بذلك مباشرة من التطبيق.انتقل إلى ملف -> جديد/استنساخ، ثم قم بما يلي:
- أدخل عنوان URL لـ SVN البعيد باعتباره "مسار المصدر/عنوان URL".
- أدخل بيانات الاعتماد الخاصة بك عندما يُطلب منك ذلك.
- أدخل موقع المجلد المحلي باسم "مسار الوجهة".
- أعطه إسما.
- في الخيارات المتقدمة ، حدد "git" من القائمة المنسدلة في "إنشاء مستودع محلي من النوع".
- يمكنك بشكل اختياري تحديد مراجعة للاستنساخ منها.
- ضرب استنساخ.
افتح الريبو في SourceTree وسترى أنه تم ترحيل رسائل الالتزام الخاصة بك أيضًا.
انتقل الآن إلى المستودع -> إعدادات المستودع وأضف تفاصيل الريبو عن بعد الجديدة.احذف جهاز التحكم عن بعد لـ SVN إذا كنت ترغب في ذلك (لقد فعلت ذلك من خلال خيار "تحرير ملف التكوين".
ادفع الرمز إلى الريبو البعيد الجديد عندما تكون جاهزًا وقم بالرمز بحرية.
ل جيتلاب المستخدمين لقد وضعت جوهرًا حول كيفية ترحيلي من SVN هنا:
https://Gist.github.com/leftclickben/322b7a3042cbe97ed2af
خطوات الهجرة من SVN إلى GitLab
يثبت
- تتم استضافة SVN في
svn.domain.com.au
. - يمكن الوصول إلى SVN عبر
http
(يجب أن تعمل البروتوكولات الأخرى). - تتم استضافة GitLab في
git.domain.com.au
و:- يتم إنشاء مجموعة بمساحة الاسم
dev-team
. - يتم إنشاء حساب مستخدم واحد على الأقل، وإضافته إلى المجموعة، ويحتوي على مفتاح SSH للحساب المستخدم للترحيل (اختبر باستخدام
ssh git@git.domain.com.au
). - المشروع
favourite-project
يتم إنشاؤه فيdev-team
مساحة الاسم.
- يتم إنشاء مجموعة بمساحة الاسم
- الملف
users.txt
يحتوي على تفاصيل المستخدم ذات الصلة، مستخدم واحد في كل سطر من النموذجusername = First Last <address@domain.com.au>
, ، أينusername
هو اسم المستخدم الوارد في سجلات SVN.(راجع الرابط الأول في قسم المراجع للحصول على التفاصيل، ولا سيما الإجابة بواسطة المستخدم كيسي).
الإصدارات
- نسخة التخريب 1.6.17 (r1128011)
- نسخة جيت 1.9.1
- إصدار GitLab 7.2.1 ff1633f
- خادم أوبونتو 14.04
الأوامر
bash
git svn clone --stdlayout --no-metadata -A users.txt
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master
هذا كل شيء!أعد تحميل صفحة المشروع في واجهة مستخدم ويب GitLab وسترى جميع الالتزامات والملفات مدرجة الآن.
ملحوظات
- إذا كان هناك مستخدمين غير معروفين، فإن
git svn clone
سيتوقف الأمر، وفي هذه الحالة، قم بالتحديثusers.txt
,cd favourite-project
وgit svn fetch
سيستمر من حيث توقف. - المعيار
trunk
-tags
-branches
مطلوب تخطيط لمستودع SVN. - عنوان URL لـ SVN المعطى لـ
git svn clone
يتوقف الأمر عند المستوى الأعلى مباشرةtrunk/
,tags/
وbranches/
. - ال
git svn clone
يُنتج الأمر الكثير من المخرجات، بما في ذلك بعض التحذيرات في الأعلى؛لقد تجاهلت التحذيرات.
جانبًا آخر، يعد الأمر git-stash بمثابة هبة من السماء عند محاولة تنفيذ الأمر git-svn dcommits.
عملية نموذجية:
- إعداد جيت الريبو
- القيام ببعض الأعمال على ملفات مختلفة
- قرر التحقق من بعض الأعمال باستخدام git
- تقرر
svn-dcommit
- احصل على الخطأ المخيف "لا يمكن الالتزام بفهرس قذر".
الحل (يتطلب بوابة 1.5.3+):
git stash; git svn dcommit ; git stash apply
فيما يلي نص برمجي بسيط لـ Shell بدون تبعيات من شأنه تحويل واحد أو أكثر من مستودعات SVN إلى git ودفعها إلى GitHub.
https://Gist.github.com/NathanSweet/7327535
في حوالي 30 سطرًا من النص:النسخ باستخدام git SVN، وإنشاء ملف .gitignore من خصائص SVN::ignore، ودفعه إلى مستودع git المجرد، وإعادة تسمية جذع SVN إلى رئيسي، وتحويل علامات SVN إلى علامات git، ودفعها إلى GitHub مع الحفاظ على العلامات.
لقد بذلت الكثير من الجهد لنقل عشرات مستودعات SVN من Google Code إلى GitHub.لم يساعدني استخدام Windows.لقد كانت روبي معطوبة تمامًا في صندوق دبيان القديم الخاص بي وكان تشغيلها على Windows بمثابة مزحة.فشلت الحلول الأخرى في العمل مع مسارات Cygwin.حتى عندما عملت شيئًا ما، لم أتمكن من معرفة كيفية إظهار العلامات على GitHub (السر هو --follow-tags).
في النهاية، قمت بتجميع نصين قصيرين وبسيطين، مرتبطين أعلاه، ويعملان بشكل رائع.الحل لا يحتاج إلى أن يكون أكثر تعقيدا من ذلك!
أنا أستخدم جهاز يعمل بنظام Windows وقمت بعمل دفعة صغيرة لنقل مستودع SVN مع التاريخ (ولكن بدون فروع) إلى مستودع GIT بمجرد الاتصال
transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo
ربما يمكن لأي شخص استخدامه.يقوم بإنشاء مجلد TMP يتحقق من مستودع SVN هناك باستخدام git ويضيف الأصل الجديد ويدفعه ...ويحذف المجلد مرة أخرى.
@echo off
SET FROM=%1
SET TO=%2
SET TMP=tmp_%random%
echo from: %FROM%
echo to: %TO%
echo tmp: %TMP%
pause
git svn clone --no-metadata --authors-file=users.txt %FROM% %TMP%
cd %TMP%
git remote add origin %TO%
git push --set-upstream origin master
cd ..
echo delete %TMP% ...
pause
rmdir /s /q %TMP%
لا تزال بحاجة إلى ملف users.txt مع تعيينات المستخدم الخاصة بك مثل
User1 = User One <u.1@xxx.com>
أردت فقط إضافة مساهمتي إلى مجتمع Git.لقد كتبت نصًا برمجيًا بسيطًا للباش يقوم بأتمتة عملية الاستيراد الكاملة.على عكس أدوات الترحيل الأخرى، تعتمد هذه الأداة على git الأصلي بدلاً من jGit.تدعم هذه الأداة أيضًا المستودعات ذات سجل المراجعة الكبير و/أو النقط الكبيرة.إنه متاح عبر جيثب:
https://github.com/onepremise/SGMS
سيقوم هذا البرنامج النصي بتحويل المشاريع المخزنة في SVN بالتنسيق التالي:
/trunk
/Project1
/Project2
/branches
/Project1
/Project2
/tags
/Project1
/Project2
هذا المخطط شائع أيضًا ومدعوم أيضًا:
/Project1
/trunk
/branches
/tags
/Project2
/trunk
/branches
/tags
ستتم مزامنة كل مشروع حسب اسم المشروع:
Ex: ./migration https://svnurl.com/basepath project1
إذا كنت ترغب في تحويل الريبو الكامل، استخدم بناء الجملة التالي:
Ex: ./migration https://svnurl.com/basepath .
الاستخدام الفعال لـ Git مع Subversion هي مقدمة لطيفة لـ git-svn.بالنسبة لمستودعات SVN الحالية، يجعل git-svn هذا أمرًا سهلاً للغاية.إذا كنت تبدأ مستودعًا جديدًا، فمن الأسهل جدًا إنشاء مستودع SVN فارغ أولاً ثم الاستيراد باستخدام git-svn بدلاً من السير في الاتجاه المعاكس.يمكن إنشاء مستودع Git جديد ثم الاستيراد إلى SVN، لكنه أمر مؤلم بعض الشيء، خاصة إذا كنت جديدًا على Git وتأمل في الحفاظ على سجل الالتزام.
قم بتنزيل برنامج تثبيت Ruby لنظام التشغيل Windows وقم بتثبيت الإصدار الأحدث معه.أضف ملفات روبي التنفيذية إلى المسار الخاص بك.
- قم بتثبيت svn2git
- قائمة ابدأ -> كافة البرامج -> روبي -> ابدأ موجه الأوامر باستخدام روبي
ثم اكتب "gem install svn2git" وأدخل
ترحيل مستودع التخريب
افتح موجه أوامر Ruby وانتقل إلى الدليل الذي سيتم ترحيل الملفات إليه
ثم svn2git http://[المجال الاسم]/svn/ [جذر المستودع]
قد يستغرق الأمر بضع ساعات لترحيل المشروع إلى Git، ويعتمد ذلك على حجم رمز المشروع.
تساعد هذه الخطوة الرئيسية في إنشاء بنية مستودع Git كما هو مذكور أدناه.
SVN (/project_components) trunk -> GIT Master SVN (/project_components) فروع -> علامات SVN (/project_components) -> علامات GIT
قم بإنشاء المستودع البعيد وادفع التغييرات.
GitHub لديه مستورد.بمجرد إنشاء المستودع، يمكنك الاستيراد من مستودع موجود عبر عنوان URL الخاص به.سيطلب بيانات الاعتماد الخاصة بك إذا كان ذلك ممكنًا، ثم انتقل من هناك.
أثناء تشغيله، سيجد المؤلفين، ويمكنك ببساطة تعيينهم للمستخدمين على GitHub.
لقد استخدمته لعدد قليل من المستودعات الآن، وهو دقيق جدًا وأسرع أيضًا!استغرق الأمر 10 دقائق للمستودع الذي يحتوي على 4000 التزام تقريبًا، وبعد ذلك استغرق صديقي أربعة أيام!
تشير العديد من الإجابات هنا إلى https://github.com/nirvdrum/svn2git, ، ولكن بالنسبة للمستودعات الكبيرة، قد يكون هذا بطيئًا.لقد حاولت استخدام https://github.com/svn-all-fast-export/svn2git بدلاً من ذلك، فهي أداة تحمل الاسم نفسه تمامًا ولكن تم استخدامها لترحيل KDE من SVN إلى Git.
تم عمل المزيد من العمل لإعداده، ولكن عند الانتهاء من التحويل نفسه، استغرق الأمر دقائق بينما قضى النص الآخر ساعات.
هناك طرق مختلفة لتحقيق هذا الهدف.لقد جربت بعضها ووجدت واحدة تعمل بالفعل مع تثبيت git و svn على نظام التشغيل Windows.
المتطلبات الأساسية:
- git على النوافذ (لقد استخدمت هذا) https://git-scm.com/
- svn مع تثبيت أدوات وحدة التحكم (لقد استخدمت tortoise svn)
- تفريغ ملف مستودع SVN الخاص بك.
svnadmin dump /path/to/repository > repo_name.svn_dump
خطوات تحقيق الهدف النهائي (انقل كل المستودعات مع السجل إلى بوابة، أولاً بوابة محلية، ثم عن بعد)
قم بإنشاء مستودع فارغ (باستخدام أدوات وحدة التحكم أو tortoiseSVN) في الدليل REPO_NAME_FOLDER
cd REPO_NAME_PARENT_FOLDER
, ، ضع dumpfile.dump في REPO_NAME_PARENT_FOLDERsvnadmin load REPO_NAME_FOLDER < dumpfile.dump
انتظر هذه العملية، قد تكون طويلةهذا الأمر صامت، لذا افتح نافذة cmd الثانية:
svnserve -d -R --root REPO_NAME_FOLDER
لماذا لا تستخدم الملف:///......؟لأن الأمر التالي سوف يفشل معUnable to open ... to URL:
, ، وذلك بفضل الجواب https://stackoverflow.com/a/6300968/4953065قم بإنشاء مجلد جديد SOURCE_GIT_FOLDER
cd SOURCE_GIT_FOLDER
- git svn clone svn://localhost/ انتظر هذه العملية.
وأخيراً ماذا حصلنا؟
دعونا نتحقق من مستودعنا المحلي:
git log
انظر التزاماتك السابقة؟إذا كانت الإجابة بنعم - حسنا
إذن، لديك الآن مستودع git محلي يعمل بكامل طاقته ويحتوي على مصادرك وتاريخ svn القديم.الآن، إذا كنت تريد نقله إلى خادم ما، استخدم الأوامر التالية:
git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags
في حالتي، لا أحتاج إلى أمر العلامات لأن الريبو الخاص بي لا يحتوي على علامات.
حظ سعيد!
تحويل الوحدة الفرعية/المجلد svn "MyModule" إلى git مع السجل بدون علامات أو فروع.
- git svn clone-no-metadata-trunk = SomeFolder1/Offfolder2/SomeFolder3/myModule http://svnhost:port/repo_root_folder/MyModule_temp -A C: CHEETAH SVN Authors-Transform.txt
- git clone MyModule_temp MyModule
- مؤتمر نزع السلاح MyModule
- بوابة تدفق الحرف الأول
- git أصل تعيين عنوان url البعيدhttps://userid@stashhost/stash/scm/xyzxyz/MyModule.git
- git Push -u Origin master
- تطوير أصل git Push -u
للاحتفاظ بقائمة التجاهل svn، استخدم التعليقات المذكورة أعلاه بعد الخطوة 1