تحويل مشروع Mercurial إلى Git




(6)

أحتاج لتحويل مشروع زئبقي إلى مشروع git ، لكني أرغب في الحفاظ على تاريخ الالتزام سليماً. كان حلّي الحالي هو إزالة الملفات ذات الصلة بالزئبق فقط ، ثم إضافة init && إضافة الملفات التي أحتاجها يدويًا ، ولكن ذلك لن يحافظ على السجلّ. هل يوجد أي حلول لهذه؟


إذا كنت ترغب في استيراد مستودع المخزون الزئبقي الموجود لديك إلى مستودع "GitHub" ، يمكنك الآن ببساطة استخدام GitHub Importer المتاح here [تسجيل الدخول مطلوب]. لا مزيد من العبث مع تصدير سريع وما إلى ذلك (على الرغم من أنها أداة جيدة للغاية)

سوف تحصل على كل ما تبذلونه من الالتزام والفروع والعلامات سليمة. شيء واحد أكثر من رائع هو أنه يمكنك تغيير هوية البريد الإلكتروني للمؤلف كذلك. تحقق من لقطات الشاشة أدناه:


بعض الملاحظات من تجربتي تحويل Mercurial إلى Git.

1. hg-fast-export

فشل استخدام hg-fast-export واحتجت إلى - force كما هو موضح أعلاه. التالي حصلت على هذا الخطأ:

الخطأ: لا يمكن قفل ref 'refs / heads / stable': يوجد 'refs / heads / stable / sub-branch-name'؛ لا يمكن إنشاء "refs / heads / stable"

عند الانتهاء من تصدير سريع الزئبق انتهيت مع الريبو المبتور. أعتقد أن هذا الريبو كان به عدد قليل من الفروع اليتيمة وأن تصدير الزئبق يحتاج إلى ريبو مثالي إلى حد ما. بدا هذا كله تقريبًا حول الحواف ، لذلك انتقلت إلى Kiln Harmony ( http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/ )

2. الفرن

لا يبدو أن Kiln Harmony موجودة في حساب مجاني كما هو موضح أعلاه. كان بإمكاني الاختيار ما بين Git-only و repos Mercurial-only وليس هناك خيار للتبديل. لقد رفعت تذكرة دعم وسأشارك النتيجة إذا قاموا بالرد.

3. زئبق-جيت

إن المكوّن الزئبقي Hg-Git الإضافي ( hg-git ) كان يعمل لي. FYI على نظام التشغيل Mac OSX لقد قمت بتثبيت hg-git عبر macports على النحو التالي:

  • ميناء sudo تثبيت python27
  • حدد ميناء sudo - مجموعة بيثون python27
  • ميناء sudo تثبيت py27-hggit
  • vi ~ / .hgrc

.hgrc يحتاج إلى هذه السطور:

[ui]
username = Name Surname <[email protected]>

[extensions]
hgext.bookmarks =
hggit = 

ثم حققت نجاحًا مع:

hg push git+ssh://[email protected]:myaccount/myrepo.git

4. التحذير: معرفة الريبو الخاص بك

كل ما سبق ذكره هو أدوات حادة ولم أتقدم إلا للأمام لأن ذلك استغرق وقتا كافيا لجعل الفريق يستخدم بوابة بشكل صحيح.

عند دفع المشروع لأول مرة لكل (3) انتهى بي الأمر مع جميع التغييرات الجديدة المفقودة. ويرجع ذلك إلى أنه يجب عرض هذا السطر من الشفرة كدليل فقط:

$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created

النظرية هي أن الفرع الافتراضي يمكن اعتباره سائدًا عند الدفع إلى بوابة ، وفي حالتي ورثت ريبوًا حيث استخدم "ثابتًا" كمكافئ للماجستير. علاوة على ذلك ، اكتشفت أيضًا أن طرف الريبو كان إصلاحًا عاجلاً لم يتم دمجه بعد مع الفرع "المستقر".

بدون فهم كل من Mercurial و الريبو الذي سيتم تحويله ، ربما تكون أفضل حالاً ألا تقوم بالتحويل.

قمت بما يلي لكي احصل على الريبو جاهزًا لمحاولة تحويل ثانية:

hg update -C stable
hg merge stable/hotfix-feature
hg ci -m "Merge with stable branch"
hg push git+ssh://[email protected]:myaccount/myrepo.git

بعد ذلك ، كان لدي مشروع مكافئ يمكن التحقق منه في git ، ومع ذلك فقد اختفت جميع الفروع اليتيمة التي ذكرتها سابقًا. لا أعتقد أن هذا أمر خطير للغاية ، لكنني قد أعيش لنأسف لذلك كإشراف. لذلك فكرتي الأخيرة هي الحفاظ على الأصل على أي حال.

تعديل: إذا كنت تريد فقط الالتزام الأخير في git ، فهذا أبسط من الدمج السابق:

hg book -r tip master
hg push git+ssh://[email protected]:myaccount/myrepo.git

سيكون هذا أفضل كتعليق ، آسف ليس لدي أذونات التعليق.

كان تعليق @ mar10 القطعة المفقودة كنت بحاجة للقيام بذلك.

لاحظ أن "/ path / to / old / mercurial_repo" يجب أن يكون مسارًا على نظام الملفات (وليس عنوان URL) ، لذا يجب عليك استنساخ المستودع الأصلي من قبل. - يوم 10 ديسمبر 27 '13 الساعة 16:30

كان هذا التعليق في ما يتعلق بالإجابة التي حلت هذا بالنسبة لي ، https://.com/a/10710294/2148757 وهو نفس الإجابة كإجابة صحيحة هنا ، https://.com/a/16037861/2148757

أدى هذا إلى نقل مشروع hg إلى git بحيث لا يتأثر سجل الالتزام.


كان لدي مهمة مماثلة للقيام بها ، ولكنها احتوت على بعض الجوانب التي لم تكن مغطاة بما يكفي من الإجابات الأخرى هنا:

  • كنت أرغب في تحويل جميع (في حالتي: اثنين ، أو بشكل عام: أكثر من واحد) فروع ريبو بلدي.
  • كان لدي غير ASCII و (كونها مستخدم Windows) أحرف غير UTF8-encoded (للفضول: umlaute الألمانية) في بلدي تلتزم رسائل وأسماء الملفات.

لم أحاول تصدير سريع وتصدير hg-fast ، لأنها تتطلب أن يكون لديك بايثون وبعض وحدات بيثون Mercurial على جهازك ، والتي لم يكن لدي.

لقد جربت hg-init مع TortoiseHG ، وأعطتني هذه الإجابة بداية جيدة. ولكن يبدو أنه يحول فقط الفرع الحالي ، وليس كل مرة واحدة (*). لذلك قرأت مستندات hg-init ونشر هذه المشاركة في المدونة

[git]  
branch_bookmark_suffix=_bookmark

ل mercurial.ini الخاص بي ، وفعلت

hg bookmarks -r default master  
hg bookmarks -r my_branch my_branch_bookmark  
hg gexport

(قم بتكرار السطر الثاني لكل فرع تريد تحويله ، وكرره مرة أخرى إذا كان يجب عليك القيام بعمل التزام آخر قبل تنفيذ السطر الثالث). يؤدي ذلك إلى إنشاء ملف git داخل .hg ، والذي يتضح أنه git repo مكشوف مع جميع الفروع المصدرة. أنا يمكن استنساخ هذا الريبو وكان نسخة عمل على النحو المرغوب فيه.

أو تقريبا ...

جري

git status

على نسخة العمل الخاصة بي وأظهرت جميع الملفات مع أحرف غير ASCII في أسمائها كملفات untracked. لذلك واصلت البحث واتبعت هذه النصيحة :

git rm -rf --cached \*  
git add --all
git commit 

وأخيرا كان الريبو على استعداد لدفعه إلى Bitbucket :-)

كما أنني حاولت المستورد جيثب كما هو مذكور في هذا الجواب . استخدمت Bitbucket كنظام المصدر ، وقام Github بعمل جيد ، بمعنى أنه قام بتحويل جميع الفروع تلقائيًا. ومع ذلك ، فقد أظهرت '؟' - أحرف لجميع الأحرف غير ASCII في رسائل الالتزام الخاصة بي (Web-UI والمحلية) وأسماء الملفات (Web-UI فقط) ، وبينما أتمكن من إصلاح أسماء الملفات كما هو موضح أعلاه ، لم يكن لدي أي فكرة ما يجب فعله برسائل الالتزام ، ولذلك أفضل نهج hg-init. بدون مشكلة الترميز ، كان مستورد Github حلًا مثاليًا وسريعًا (طالما أنك تمتلك حساب Github مدفوع الأجر أو يمكنك تحمل أن يكون الريبو الخاص بك عامًا طالما أنه يتطلب سحبه من Github إلى جهازك المحلي).

(*) لذا بدا الأمر قبل أن أكتشف أنه يجب علي وضع إشارة مرجعية على جميع الفروع التي أريد تصديرها. إذا قمت بذلك وقمت بدفع الريبو العاري (!) ، كما تقول الإجابة المرتبطة ، تحصل على جميع الفروع.


هناك خيار آخر هو إنشاء حساب حر بنقل قمينة (kiln) بين القمامة و hg مع احتجاز البيانات الوصفية بنسبة 100٪ ، بحيث يمكنك استخدامه لمرة واحدة أو استخدامه للوصول إلى مستودع باستخدام أي عميل تفضله.


يمكنك تجربة استخدام fast-export :

cd ~
git clone https://github.com/frej/fast-export.git
git init git_repo
cd git_repo
~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo
git checkout HEAD

أيضا إلقاء نظرة على هذا السؤال .





mercurial