एक मर्क्यूरियल रिपॉजिटरी के साथ इंटरऑपरेबिलिटी हासिल करें


195

मैं एक पर GIT का उपयोग MAC। पर्याप्त कथन। मेरे पास उपकरण हैं, मेरे पास अनुभव है। और मैं इसका उपयोग जारी रखना चाहता हूं। यहां कोई युद्ध नहीं ...

समस्या हमेशा अंतर के साथ है। ज्यादातर लोग एसवीएन का उपयोग करते हैं, जो मेरे लिए बहुत अच्छा है। Git SVN बॉक्स से बाहर काम करता है, और कोई तामझाम समाधान नहीं है। लोग खुशी-खुशी SVN का उपयोग जारी रख सकते हैं और मैं अपने वर्कफ़्लो को नहीं खोता और न ही अपने टूल्स को।

अब ... कुछ लोग मर्क्यूरियल के साथ आते हैं। उनके लिए ठीक है: उनके पास अपने कारण हैं। लेकिन मुझे कोई जीआईटी एचजी आउट-ऑफ-द-बॉक्स नहीं मिल सकता है। मैं HG पर स्विच नहीं करना चाहता, लेकिन मुझे अभी भी उनके भंडार के साथ हस्तक्षेप करने की आवश्यकता है।

आप में से कोई भी लोग इसके लिए एक सरल उपाय जानते हैं?


4
hg-git दोनों दिशाओं में काम करता है।
डेरेक महार

1
@Dubiousjim द्वारा दिया गया उत्तर, वर्तमान शीर्ष दो की तुलना में अधिक उपयोगी, व्यापक और अधिक अद्यतित है, जो कि रेपो को अस्वीकार करने या पुरानी सलाह देने के लिए इशारा कर रहे हैं। लेकिन अभी तक इस सवाल पर अधिक अपडेट बहुत मददगार होंगे।
nealmcb

जवाबों:


60

जून 2012 से अपडेट करें। वर्तमान में Git / Hg इंटरऑपरेबिलिटी के लिए निम्नलिखित तरीके प्रतीत होते हैं, जब डेवलपर जीओपी पक्ष से काम करना चाहता है:

  1. मर्क्यूरियल और hg-git एक्सटेंशन स्थापित करें । आप अपने पैकेज मैनेजर का उपयोग करके या उसके साथ उत्तरार्द्ध कर सकते हैं easy_install hg-git। फिर सुनिश्चित करें कि निम्नलिखित आपके ~ / .hgrc में है:

    [extensions]
    hggit = 
    

    आप कुछ संदर्भ देख सकते हैं जो bookmarksयहां भी विस्तार को निर्दिष्ट करने के बारे में बात करते हैं, लेकिन यह वी 1.8 के बाद से मर्क्यूरियल में बनाया गया है। यहाँ विंडोज पर hg-git को स्थापित करने के बारे में कुछ सुझाव दिए गए हैं

    एक बार आपके पास hg-git होने पर, आप ऊपर पोस्ट किए गए Abderrahim Kitouni की तरह लगभग कमांड का उपयोग कर सकते हैं । इस पद्धति को 2009 के बाद से परिष्कृत और ट्विक किया गया है , और एक अनुकूल आवरण है: git-hg-again । यह एक ही समय में मर्क्यूरियल और गिट दोनों के लिए एक कार्यशील निर्देशिका के रूप में टॉपवेल निर्देशिका का उपयोग करता है। यह एक Mercurial बुकमार्क बनाता है जिसे वह defaultMercurial रिपॉजिटरी में (अनाम) शाखा के सिरे के साथ रखता है, और यह उस बुकमार्क से एक स्थानीय Git शाखा को अपडेट करता है।

  2. git-Remote-hg एक अलग आवरण है, जो मर्क्यूरियलhg-gitएक्सटेंशनपर भी आधारित है। यह अतिरिक्त रूप सेgit-remote-helpersप्रोटोकॉलका उपयोग करताहै (इसलिए इसका नाम)। यह केवल गिट वर्किंग डाइरेक्टरी के लिए टॉपवेल डायरेक्टरी का उपयोग करता है; यह अपने मर्क्यूरियल भंडार को नंगे रखता है। यह Git और Mercurial सुरक्षित और अधिक मुहावरेदार gitlike के बीच सिंकिंग बनाने के लिए एक दूसरे नंगे गिट रिपॉजिटरी को भी बनाए रखता है।

  3. Git-एचजी स्क्रिप्ट (पूर्व में बनाए रखा यहाँ ), एक अलग विधि का उपयोग करता के आधार पर hg-fast-exportसे तेजी से निर्यात परियोजना । विधि 2 की तरह, यह एक नंगे मर्क्यूरियल रिपॉजिटरी और एक अतिरिक्त नंगे गिट रिपॉजिटरी भी रखता है।

    खींचने के लिए, यह उपकरण Mercurial बुकमार्क्स को नजरअंदाज करता है और इसके बजाय प्रत्येक नामित Mercurial शाखा को Git शाखा में आयात करता है, और डिफ़ॉल्ट (अनाम) Mercurial शाखा को मास्टर में।

    कुछ कमेंटरी इस टूल की चर्चा hg-> git के रूप में करती है, लेकिन यह 7 जुलाई 2011 को git-> hg पुश सपोर्ट में विलय होने का दावा करता है। जैसा कि मैं इन उपकरणों की समीक्षा में समझाता हूं , हालांकि, यह उपकरण जिस तरह से लागू करने की कोशिश करता है। पुश समर्थन काम करने योग्य नहीं लगता है।

  4. एक अन्य परियोजना भी है जिसे गिट-रिमोट-एचजी कहा जाता है । ऊपर सूचीबद्ध संस्करण के विपरीत, यह hg-git पर निर्भर नहीं करता है, बल्कि सीधे Mercurial Python API तक पहुँचता है। फिलहाल, इसका उपयोग करने के लिए गिट के एक पैच संस्करण की भी आवश्यकता होती है। मैंने अभी तक यह कोशिश नहीं की है।

  5. अंत में, दर्जी एक ऐसी परियोजना है जो विभिन्न वीसीएस की एक किस्म के बीच बढ़ती है। ऐसा लगता है कि इसका विकास आक्रामक रूप से जारी नहीं रहेगा।

इनमें से पहले तीन दृष्टिकोण मुझे जांच के लिए मनाने के लिए काफी हल्के लग रहे थे। मुझे उन्हें अपने सेटअप पर चलाने के लिए उन्हें कुछ तरीकों से ट्विक करने की आवश्यकता थी, और मैंने उन्हें बेहतर बनाने के लिए उन्हें आगे ट्विक करने के कुछ तरीके देखे, और फिर मैंने उन्हें फिर से ट्वीक किया ताकि वे एक दूसरे की तरह व्यवहार कर सकें ताकि मैं मूल्यांकन कर सकूं उन्हें और अधिक प्रभावी ढंग से। फिर मैंने सोचा कि दूसरों को भी यही मूल्यांकन करना पसंद है। इसलिए मैंने एक स्रोत पैकेज बनाया है जो आपको पहले तीन टूल में से किसी एक के मेरे संस्करण को स्थापित करने में सक्षम करेगा। इसमें आवश्यक hg-fast-exportटुकड़ों को स्थापित करने का भी ध्यान रखना चाहिए । (आपको hg-gitअपने आप को स्थापित करने की आवश्यकता है ।)

मैं आपको उन्हें आज़माने के लिए प्रोत्साहित करता हूं और अपने लिए तय करता हूं कि सबसे अच्छा क्या है। मुझे उन मामलों के बारे में सुनकर खुशी होगी जहां ये उपकरण टूटते हैं। मैं उन्हें अपस्ट्रीम परिवर्तनों के साथ सिंक में रखने की कोशिश करूँगा, और यह सुनिश्चित करने के लिए कि अपस्ट्रीम लेखकों को मेरे द्वारा उपयोगी ट्विक्स के बारे में पता है।

जैसा कि मैंने ऊपर उल्लेख किया है, इन उपकरणों का मूल्यांकन करने में, मैं इस निष्कर्ष पर पहुंचा हूं कि git-hgकेवल मर्क्यूरियल से खींचने के लिए उपयोग करने योग्य है, धक्का देने के लिए नहीं।

संबंधित, यहाँ Git और Mercurial के बीच कुछ उपयोगी तुलना / अनुवाद मैनुअल हैं, कुछ मामलों में उन उपयोगकर्ताओं पर लक्षित है जो पहले से ही जानते हैं:


2
मैं स्वयं विधि # 2 का उपयोग कर रहा हूं, या इसके बजाय मेरा ट्वीक किया गया संस्करण। कुल मिलाकर जो मुझे सबसे विश्वसनीय और लचीला दृष्टिकोण (मेरे द्वारा आजमाया गया) लगता है। विवरण के लिए मेरी समीक्षा / स्रोत पैकेज के लिंक देखें।
dubiousjim

हाँ। किल हार्मनी कमाल की है। एकल देवों के लिए भी नि: शुल्क।
सीएडी ने

114

एक नया गिट-रिमोट-एचजी है जो मूल समर्थन प्रदान करता है:

मर्क्यूरियल और बाजार के लिए गिट में पुल का समर्थन

बस git-Remote-hg को अपने $ PATH पर कॉपी करें, इसे निष्पादन योग्य बनाएं और यही है, कोई निर्भरता (Mercurial के अलावा):

git clone hg::https://www.mercurial-scm.org/repo/hg/

आपको इसे धक्का और खींचने में सक्षम होना चाहिए जैसे कि यह एक देशी गिट रिपॉजिटरी था।

जब आप नई Git शाखाओं को धक्का देते हैं, तो उनके लिए Mercurial बुकमार्क बनाए जाएंगे।

देखें Git-remote-एचजी विकि अधिक जानकारी के लिए।


14
हे फेलिप, यह बिल्कुल सच नहीं है, आपको एक निर्भरता के रूप में
भाड़े के

5
सुनिश्चित करें कि आप इसे बिल्कुल नाम दें git-remote-hg(यानी कोई .pyप्रत्यय)।
schmmd

3
काम करता है जब hg रिपॉजिटरी एक सबमॉड्यूल के रूप में अच्छी तरह से है।
क्लेटन स्टेनली

4
ध्यान दें कि आपको अजगर की आवश्यकता है 2. इसलिए यदि अजगर 3 आपके सिस्टम पर डिफ़ॉल्ट है (या यदि आप डेबियन नहीं चलाते हैं और भविष्य के प्रमाण बनना चाहते हैं) तो पहली पंक्ति को बदल दें #!/usr/bin/env python2
केविन कॉक्स

4
ध्यान दें कि चूंकि Mercurial 3.2 @FelipeC का git-Remote-hg अब काम नहीं करता है ( github.com/felipec/git-remote-hg/issues/27 ), जब तक कि फ़र्क जो समस्या को ठीक नहीं करता है ( github देखें) .com / फ़िंगोल्फिन / गिट-रिमोट-एचजी )
सिम्बलि

106

आपको hg-git का उपयोग करने में सक्षम होना चाहिए ।

hg clone <hg repository>

संपादित करें ~/.hgrcऔर जोड़ें:

[extensions]
hgext.bookmarks =
hggit =

एक बुकमार्क बनाएं ताकि आपके पास mastergit में एक हो:

cd <repository>
hg bookmark -r default master

.hg/hgrcरिपॉजिटरी में संपादित करें और जोड़ें:

[git]
intree = true

अब आप गिट रिपॉजिटरी बना सकते हैं:

hg gexport

और आप परिणामी निर्देशिका को गिट क्लोन के रूप में उपयोग कर सकते हैं। मर्क्यूरियल से खींचना होगा:

hg pull
hg gexport

और भाड़े पर धकेलना:

hg gimport
hg push

(हाँ, आपको इस वर्कफ़्लो के साथ hg का उपयोग करने की आवश्यकता है लेकिन आपकी हैकिंग सब कुछ समझ में आ जाएगी)

PS यदि आपको इस वर्कफ़्लो के साथ कोई समस्या है, तो कृपया बग दर्ज करें।


3
easy_install hg-git को पहली बार चलाना न भूलें
क्रिश्चियन Oudard

1
बिल्कुल वैसा नहीं जैसा मैं चाहता था, लेकिन फिर भी उल्लेखनीय है। धन्यवाद।
ह्यूगो सेरेनो फरेरा

3
बस एक फी, एक स्थानीय एचजी रेपो पर एक बार इस प्रक्रिया के माध्यम से चलने के बाद (और कुछ गलत कर रहा है) मैं गिट के उपयोग के परिणामस्वरूप रेपो को क्लोन करने में सक्षम नहीं था। मुझे स्रोत एचजी रेपो को "एचजी क्लोन" करना था, नए एचजी रेपो पर दिए गए चरणों का पालन करें और फिर नए एचजी रेपो का क्लोन तैयार करें।
रॉकी बर्ट

1
मुझे यह तब मिलता है जब एक git statusकमांड $ git स्टेटस घातक जारी करने की कोशिश की जाती है : यह ऑपरेशन एक कार्य ट्री में चलाया जाना चाहिए। यह तब है जब मैंने hg gexportहौसले से क्लोन किए गए hg रिपॉजिटरी में जारी किया है। नंगे रिपोजिटरी के आसपास पाने के लिए क्या संभव है? अद्यतन करें । जाहिर है, रॉक बर्ट का सुझाव काम करता है। धन्यवाद
yesudeep

1
@ThaDon मुझे वही समस्या है। जाहिरा तौर पर git रेपो को .hg / git के रूप में बनाया जाता है। इसका हल 'ln -s .hg / git .git' है।
mb14

15

आप कोशिश कर सकते हैं hg2git, जो कि पायथन लिपि है और तेज-निर्यात का हिस्सा है, जिसे आप http://repo.or.cz/w/fast-export.git पर देख सकते हैं ।

हालांकि आपको मर्क्यूरियल इंस्टॉल करना होगा।


4
इसने एक hg रेपो को git रेपो में बदल दिया, बहुत बहुत धन्यवाद!
२०:२०

यह पटकथा मेरे लिए विफल रही, लेकिन मूल hg-fast-exportने ठीक काम किया
आंद्रेई

मुझे लगता है कि वर्तमान में hg-fast-exportस्क्रिप्ट को भेज दिया जाता है hg2git। मैं हालांकि यह सब पता नहीं लगा है। ध्यान दें कि ये उपकरण केवल Hg-> Git से जाने की अनुमति देते हैं, रिवर्स नहीं।
डबियसजिम

9

चूंकि hg-git एक दो- मार्ग पुल है, इसलिए यह आपको Git से Mercurial तक के बदलावों को आगे बढ़ाने की अनुमति देगा।


6

एचजी-गिट मर्क्यूरियल प्लगिन । यह खुद करने की कोशिश नहीं की है, लेकिन बाहर की जाँच के लायक हो सकता है।


7
यह एक प्लगइन है जो मर्क्यूरियल उपयोगकर्ताओं को गिट रिपोज से धक्का देने और खींचने की अनुमति देता है, न कि दूसरे तरीके से, जो ओपी चाहता है।
sykora

1
@sykora, इसका उपयोग रिवर्स डायरेक्शन से इंटरऑपरेबिलिटी को चलाने के लिए भी किया जा सकता है। कुछ उपकरण देखें जिन्हें मैं अपने उत्तर में सूचीबद्ध करता हूं।
डब्युटीजिम

6

मुझे https://github.com/cosmin/git-hggit-hg से बहुत बड़ी सफलता मिली है (इसके लिए भी काम करने की आवश्यकता है)। यह लाने, खींचने और धक्का देने का समर्थन करता है और मेरे लिए (इसी तरह की विशेषताओं से) अधिक स्थिर हैhghg-githg गिट )।

उपयोग उदाहरणों के लिए https://github.com/cosmin/git-hg#usage देखें । उपयोगकर्ता इंटरफ़ेस बहुत समान हैgit-svn

git-hgप्रत्येक क्लोन hg रेपो के लिए अतिरिक्त डिस्क स्थान की आवश्यकता होती है। कार्यान्वयन पूर्ण मर्क्यूरल क्लोन, एक अतिरिक्त गिट नंगे क्लोन और वास्तविक गिट रेपो का उपयोग करता है। आवश्यक डिस्क स्थान लगभग केवल सामान्य गिट उपयोग का 3 गुना है। अतिरिक्त प्रतियां .gitआपकी कार्यशील निर्देशिका (या GIT_DIRहमेशा की तरह बताई गई जगह ) की निर्देशिका के नीचे संग्रहीत की जाती हैं ।

नोटिस: बुनियादी समस्या यह है कि git-hgके बीच 1 मानचित्रण: की कोशिश करता हल करने के लिए कोई 1 है कि वहाँ है gitऔर hgसुविधाओं। सबसे बड़ी समस्या git शाखाओं और hg अनाम शाखाओं और hg नामित शाखाओं और hg बुकमार्क के बीच प्रतिबाधा बेमेल है (ये सभी gitउपयोगकर्ताओं के लिए शाखाओं की तरह दिखते हैं )। एक संबंधित समस्या यह है कि hgसंस्करण इतिहास में मूल नाम की शाखा के नाम को बचाने के लिए कोशिश करता है के रूप में विरोध करने के लिए जहां शाखा का नाम केवल डिफ़ॉल्ट रूप से टेम्पलेट प्रतिबद्ध संदेश में जोड़ा जाता है।

कोई भी उपकरण जो बीच git- बीच में इंटरप्रेन्योर ब्रिज बनाने का दावा करता है और hgउसे यह बताना चाहिए कि इस प्रतिबाधा से कैसे निपटना है। आप तब तय कर सकते हैं कि चयनित समाधान आपकी आवश्यकताओं के अनुरूप है या नहीं।

समाधान जो git-hgउपयोग करता है वह सभी एचजी बुकमार्क को त्यागने और नामित शाखाओं को गिट शाखाओं में बदलने के लिए है। इसके अलावा यह git मास्टर ब्रांच को डिफॉल्ट अनाम hg ब्रांच में सेट करता है।


ऐसा लगता है git-hgकि केवल एचजी से खींचने के लिए ही व्यवहार्य है, धक्का देने के लिए नहीं (मेरे उत्तर में स्पष्टीकरण की व्याख्या करें)। क्या आपने दोनों दिशाओं में इसे सफलतापूर्वक उपयोग करने का कोई तरीका पाया है? अतिरिक्त स्थान के रूप में, मैं जिन तकनीकों से परिचित हूं, उनमें वर्क डाइर + की एक प्रति git db / मेटाडेटा + hg db / मेटाडेटा की एक कॉपी शामिल है। Git db / मेटाडेटा की दूसरी प्रति जोड़ने से अधिक डिस्क उपयोग शामिल होता है, हाँ, लेकिन तुलनात्मक रूप से कहें तो यह उतना बुरा नहीं है जितना यह लग सकता है।
डबियसजिम

@dubiousjim मेरी ज़रूरतें एक काम करने वाले पुल / भ्रूण के साथ भरी हुई थीं और मैंने वास्तव में कभी भी पुश का परीक्षण नहीं किया। मैं दस्तावेज़ीकरण पर भरोसा कर रहा था, लेकिन आपके स्पष्टीकरणों की जांच करने के बाद, अब मुझे विश्वास है कि git-hgधक्का देने के लिए उपयुक्त नहीं है। मैंने अपने उत्तर को और अधिक स्पष्ट करने के लिए संशोधित किया जो pushपर्याप्त रूप से स्थिर नहीं है।
मिको रानतलायनेन

बहुत बुरा, मैंने सोचा कि सफलतापूर्वक पुश का उपयोग करने का कोई तरीका हो सकता है जो मैं नहीं देख रहा था।
डबियसजिम

1
प्रतिबाधा बेमेल को उजागर करने के लिए +1 और क्या देखना है
मैट विल्की

3

कोशिश की है। मेरे लिए काम करता है, क्योंकि मुझे git'ers और hg'ers के काम का सामना करना पड़ता है। विशेष रूप से समीक्षाओं के लिए यह बहुत अच्छा है।

उस विषय पर एक मामूली समस्या / चेतावनी:

मैंने hg के साथ एक स्थिर लिनक्स कर्नेल रिपॉजिटरी को क्लोन करने की कोशिश की है। इन रिपॉजिटरी को git में बनाए रखा जाता है और आमतौर पर इसमें बड़ी संख्या में फाइलें होती हैं।

यह बहुत धीमा था। पूरी तरह से क्लोन करने और एक कामकाजी प्रतिलिपि अपडेट करने के लिए मुझे 2 दिन लगे ।


यह बेहतर प्रतीत हो रहा है --- मेरा चेकआउट लगभग छह घंटे से चल रहा है, और यह दावा करता है कि जाने के लिए केवल एक और नौ है ...
डेविड ने

मैं उसे वापस ले लेता हूँ। यह अब लगभग 25 घंटे से चल रहा है, और यह अभी भी दावा करता है कि जाने के लिए केवल एक और नौ है। दो दिन, आपने कहा?
डेविड ने

1
मैंने अनुभव किया कि - मेरी पहली कोशिश बिल्कुल काम नहीं की थी - मुझे लगता है कि यह कुछ बग था, लेकिन कभी भी विश्लेषण नहीं किया कि मेरी दूसरी कोशिश पर - एक अद्यतन hg-git के साथ मेरी मैक बुक को पूरा करने में लगभग 50 घंटे लगे। प्रो (2.66GHz, 8 गिग रैम)
Wizz

39 घंटे अब, तो केवल 11 जाने के लिए! क्वाड कोर एएमडी फेनोम। यह है प्रगति कर, जिसके कारण मैं दे रहा हूँ इसे चलाने (Hg प्रगति बार विस्तार एक है चाहिए है)। यह एक सीपीयू को पेग करने और बिना किसी सीपीयू का उपयोग करने और बहुत सारे डिस्क एक्सेस करने के बीच वैकल्पिक है।
डेविड

अगर खराब प्रदर्शन की वजह से किसी को भी परीक्षण किया गया है hggitया है hgभी सामान्य रूप में गिरी आकार परियोजनाओं के साथ प्रयोग करने योग्य होने के लिए धीमी गति से?
मिको रानाल्टेन

1

मैं कोशिश की है कॉस्मिन के Git-एचजी और Git-एचजी-फिर abourget के दोनों पर मठ के एचजी रेपो , ऐसा लगता है कि बाद में एक मर्ज के क्रम का सम्मान करता है, पूर्व थोड़ा यादृच्छिक है। आप नीचे स्क्रीनशॉट से देख सकते हैं।

लौकिक के git-hg द्वारा आयातित म्यूट का मर्ज इतिहास ग्राफ :

यहां छवि विवरण दर्ज करें

मर्ज के इतिहास का ग्राफ, जिसे अबाउट के git-hg-again द्वारा आयात किया गया है :

यहां छवि विवरण दर्ज करें

एक्टुआल इतिहास ग्राफ मग द्वारा hgk द्वारा प्लॉट किया गया है:

यहां छवि विवरण दर्ज करें

जैसा कि आप ऊपर से देख सकते हैं, abourget के git-hg-again द्वारा दूसरा ग्राफ मूल hgk ग्राफ़ के बहुत करीब है और वास्तव में म्यूट के वास्तविक वर्कफ़्लो को दर्शा रहा है।

Git-hg-फिर से पाया गया एक दोष यह है कि इसमें 'hg' रिमोट नहीं जोड़ा जाता है, बल्कि इसके सभी refs को स्थानीय टैग के रूप में आयात करता है, git-hg में एक अद्भुत 'hg' रिमोट होता है जो अपस्ट्रीम hg repo को दर्शाता है।


1
मुझे ऐसा लगता है कि कॉसमैन और एबगॉरट द्वारा संस्करणों के बीच अंतर मर्ज कमिट में माता-पिता का आदेश है। एक अच्छा इतिहास विज़ुअलाइज़ेशन टूल (जैसे gitk) दोनों इतिहासों को समान रूप से प्रस्तुत करने में सक्षम होना चाहिए। केवल स्पष्ट रूप से याद आ रही चीज hg/stableसंस्करण में abourget द्वारा शाखा है। मुझे लगता है कि यह नामित शाखाओं, नामांकित शाखाओं और मर्क्यूरियल में बुकमार्क के बीच की बात है।
मिकको रैंटलैनेन

0

सेवा Git-hg मिरर के साथ टू-वे hg-git (और git-git, hg-hg) सिंक भी संभव है । यह पर्दे के पीछे hg-git (दूसरों के बीच) का उपयोग करता है और इसका कोड भी खुला स्रोत है।


अस्वीकरण : मैं इसके पीछे कंपनी से हूँ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.