2009-12-15 20 views
10

मेरे पास कई रिमोट रिपॉजिटरीज़ हैं जिन्हें मैं एक साथ विलय करना चाहता हूं। उन रिपॉजिटरीज़ में से कुछ उप-रिमोट रिमोट के लिए अद्वितीय हैं (उनमें डेटा शामिल है जो होस्ट-विशिष्ट है), अन्य सबट्री में ऐसे डेटा होते हैं जो सभी रिमोट्स में आम हैं (माना जाता है)।"गिट मर्ज-एस ​​उनके" की आवश्यकता है - लेकिन मुझे पता है कि यह मौजूद नहीं है

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

एक सामान्य फ़ाइल में बदलाव (इसे एफ कहते हैं, एफ को बदलने के साथ ') एक समस्या नहीं होनी चाहिए, भले ही यह केवल पहले एक रिमोट पर हो। गिट-मर्ज सही चीज करेगा और मुझे मेरे समग्र वर्कस्पेस में एफ की एक प्रति देगी, जो मैं चाहता हूं। समस्या तब आती है जब एक ही सामान्य फ़ाइल किसी अन्य रिमोट (इसे एफ कहते हैं) पर अलग-अलग तरीके से बदलती है। गिट-मर्ज मुझे एफ 'और एफ "का एक समग्र प्रदान करेगा, जो मैं नहीं चाहता हूं। मैं चाहता हूं कि एफ "

जब मैंने साफ़केस के साथ काम किया तो हमने इसे एक प्रति-विलय कहा। विलय का परिणाम हमेशा योगदानकर्ता की एक सटीक प्रति थी। यह बहुत कुछ लगता है जैसे" गिट मर्ज-उनका " होगा, सिवाय इसके कि यह अस्तित्व में नहीं है।

मुझे आश्चर्य है कि मैं "गिट-रीड-पेड़-एम - ट्रिविअलियल" के साथ कुछ पका सकता हूं ताकि तेजी से आगे निकलने के लिए विलय हो जाए, फिर करें गिट-मर्ज और एक कस्टम मेरेटूल के साथ कुछ जादू जो $ REMOTE फ़ाइल को $ MERGED पर प्रतिलिपि बनाते हैं। लेकिन इसके साथ ही मैं नहीं देखता कि मैं एफ 'और एफ "को कंपोजिट करने से गिट-विलय कैसे रोक सकता हूं अगर यह विलय है तुच्छ।

मैंने इस साइट पर Is there a "theirs" version of "git merge -s ours"? लिंक पढ़ा है, और जूनियो हैमनो द्वारा पोस्ट यह संदर्भ बताता है कि क्यों "गिट मर्ज-एस ​​उनका" इतना बुरा विचार है, लेकिन यह मेरे लिए मामला नहीं है। मैं पुराने इतिहास का महत्व देता हूं, लेकिन मुझे जहाज कूदने और रिमोट साइट पर बदलाव करने की आवश्यकता होती है जब कोई होता है। स्थानीय साइट पर कोई नया काम नहीं किया जाता है। जब किसी एक में परिवर्तन होता है तो अंतिम मतदान वाले रिमोट से नवीनतम "सामान्य" फ़ाइल लेते हुए, इसे बस सभी दूरस्थ साइटों का एक संयोजन बनाने की आवश्यकता होती है।

किसी भी मदद के लिए अग्रिम धन्यवाद, जो आप मुझे दे सकते हैं।

+0

gitattributes आदमी पृष्ठ से है: जब निर्णय लेने से क्या विशेषताओं एक करने के लिए आवंटित कर रहे हैं पथ, गिट $ GIT_DIR/जानकारी/विशेषता फ़ाइल (जिसमें उच्चतम प्राथमिकता है) का अनुपालन करता है, प्रश्न में पथ के समान निर्देशिका में फ़ाइल को फ़ाइल करता है, और इसके मूल निर्देशिका कार्य वृक्ष के अपूर्ण तक (आगे की निर्देशिका इसमें .gitattributes प्रश्न में पथ से है, इसकी प्राथमिकता कम है) ... इसलिए प्रासंगिक पेड़ के शीर्ष पर अपना .gitattribute डालें। कस्टम मर्ज ड्राइवर केवल उस पेड़ के लिए आवेदन करेगा। – VonC

+0

'echo * merge = keepTheir> dirWithCopyMerge \ .gitattributes' को सभी फ़ाइलों के लिए सभी फ़ाइलों के लिए' dirWithCopyMerge' के अंतर्गत सभी फ़ाइलों के लिए यह नहीं करना चाहिए। यह वही होना चाहिए जो आप खोज रहे हैं। – VonC

+0

मैंने अपनी पिछली टिप्पणियों को प्रतिबिंबित करने के लिए अभी अपना जवाब पूरा कर लिया है। – VonC

उत्तर

1

(अद्यतन 2011:
जवाब "git command for making one branch like another" सभी संभव तरीकों की सूची बनाता एक Git अनुकरण करने के लिए विलय -s theirs`)


विशिष्ट फ़ाइलों/पेड़ों के लिए आप प्रतिलिपि बनाना चाहते हैं, आप एक gitattributes value स्थापित कर सकते हैं जैसा कि मैंने इस SO question में उल्लेख किया है, एक कस्टम विलय ड्राइवर को परिभाषित करता है।
मर्ज विशेषता से जुड़ी स्क्रिप्ट हमेशा रिमोट फ़ाइल को विलय परिणाम के रूप में रखेगी (उदाहरण के लिए यह SO answer देखें, यद्यपि विपरीत परिदृश्य के लिए - स्थानीय संस्करण को रखते हुए)।

echo * merge=keepTheir > dirWithCopyMerge\.gitattributes 
git config merge.keepTheir.name "always keep theirduring merge" 
git config merge.keepTheir.driver "keepTheir.sh %O %A %B" 

, '* merge=keepTheir' के साथ अपनी सामग्री के रूप में सबट्री आप कॉपी-विलय कर दिया होना चाहता हूँ के शीर्ष पर एक .gitattribute सेट करके, आप प्रभावी रूप से एक कस्टम विशेषता है कि सबट्री की सभी फाइलों को चालक विलय (ध्यान दें '*' वाइल्डकार्ड का उपयोग यहां)।

KeepTheir के साथ।sh:

mv -f $3 $2 
exit 0 

आपको किसी भी "डिफ़ॉल्ट" विलय ड्राइवर को संशोधित करने की आवश्यकता नहीं है, और आप केवल अपनी इच्छित फ़ाइलों पर ही अपना आवेदन करते हैं। फ़ाइल .gitattributes में मर्ज = कस्टम चालक विशेषता के उपयोग का सुझाव देने हेतु @VonC को

+0

समाधान काम करेगा, लेकिन चूंकि मैं इसे प्रत्येक फ़ाइल के लिए करना चाहता हूं, इसलिए इसे विशेषताओं के साथ करना थोड़ा सा है। हालांकि, "विलय" पर gitattributes (5) manpage अनुभाग "merge.default" कॉन्फ़िगरेशन चर का उल्लेख करता है। यह मर्ज ड्राइवर को उन फ़ाइलों के लिए बुलाया जाता है जहां मर्ज विशेषता निर्दिष्ट नहीं है, अगर मैं इसे निर्दिष्ट नहीं करता तो मेरा पूरा भंडार होगा! तो यह है कि मैं क्या कर सकते हैं "Git config merge.default.driver 'mv -f% बी% एक && बाहर निकलने 0' 'और विशेषताओं की स्थापना के बारे में चिंता मत लग रहा है। क्या यह आपको समझ में आता है? मैंने सीपी की बजाय एमवी का इस्तेमाल किया क्योंकि यह तेज़ है। – kbro

+0

@kbro: "चूंकि मैं चाहता हूं कि यह प्रत्येक फ़ाइल के लिए हो, गुणों के साथ ऐसा करना थोड़ा सा अनजान है"। मैं कहूंगा: वास्तव में काफी "लाभकारी"; एक '*' पर्याप्त होगा। मेरा पूरा जवाब देखें। – VonC

+0

क्या '*' वाइल्डकार्ड ग्लोब पूरी तरह से यू * आईएक्स सिस्टम पर होगा, या '। *' के लिए एक अतिरिक्त विशेषता होनी चाहिए, मान लीजिए कि मैं उन फ़ाइलों को प्रतिलिपि बनाना चाहता हूं? या क्या दोनों डॉट-फाइलों और गैर-डॉट-फाइलों को ग्लोब करने का कोई तरीका है? दुख की बात है कि मुझे नहीं पता! – kbro

7

बहुत धन्यवाद। हालांकि यह काम करेगा, मैं अपने कार्यक्षेत्र को .git फ़ाइलों के साथ प्रदूषित करने में अनिच्छुक हूं, और जब मैं प्रदूषण से बचने के लिए $ GIT_DIR/जानकारी/विशेषताओं का उपयोग कर सकता हूं, तो मुझे पकड़ने के लिए 2 नियमों की आवश्यकता से परेशान है डॉट-फाइलें और गैर-डॉट फाइलें।

के बाद प्रयोग का एक सा रहा merge.default विन्यास चर (gitattributes में उल्लेख किया है (5) मैनपेज) काम कर के साथ एक समाधान पाने में कामयाब रहे। जिस चाल को मैंने याद किया वह था कि merge.defaultनाम आपके द्वारा पहले परिभाषित कस्टम ड्राइवर के लेता है; आप इसे कस्टम कमांड सीधे नहीं देते हैं। यहां मेरे लिए क्या काम करता है ...

सबसे पहले अपनी कॉपी-मर्ज कस्टम ड्राइवर को परिभाषित करें। आप सीधे शेल कमांड का उपयोग कर सकते हैं; एक बाहरी स्क्रिप्ट के लिए कोई जरूरत नहीं है (बस सुनिश्चित करें कि आप अपने खोल मेटा-चरित्र सही हवाले से मिल कर) नहीं है:

git config merge.copy-merge.name 'Copy Merge' 
git config merge.copy-merge.driver 'mv %B %A' 

ध्यान दें कि mv रिटर्न सफलता पर 0, 1 विफलता पर, रिपोर्टिंग मर्ज "सफलता" के लिए मानदंडों को पूरा वापस गिट करने के लिए।

अब Git बताते हैं कि सभी का आपस में विलय कॉपी-मर्ज के हैं:

git config merge.default copy-merge 

अरे Presto! काम हो गया। गिट विलय < शाखा > अब सब कुछ कॉपी-विलय कर देगा ताकि आपके पास जिस शाखा में हो, < शाखा > पर सभी फ़ाइलों की सटीक प्रतियां हों। QED।

आप तो एक गैर कॉपी-मर्ज करना चाहते हैं तो बस डिफ़ॉल्ट मर्ज ड्राइवर रीसेट: आप तो merge.default छोड़ अधिक चयनात्मक होना चाहते हैं, तो

git config --unset merge.default 

को सेट किए बिना और उपयोग के रूप में जिम्मेदार बताते हैं @VonC का कहना है:।

cd path/to/copy-merge/in 
echo '* merge=copy-merge' > .gitattributes 
echo '.* merge=copy-merge' >> .gitattributes 

हर सबट्री आप में कॉपी-मर्ज करना चाहते हैं के शीर्ष पर ऐसा करते हैं तो वहाँ एक उप सबट्री है कि आप में कॉपी-मर्ज करने के लिए नहीं करना चाहते, तो आप इसे बंद कर सकते हैं दोबारा:

cd path/to/copy-merge/in/path/to/normal-merge/in 
echo '* merge' > .gitattributes 
echo '.* merge' >> .gitattributes 

चेतावनी: साथ .gitattributes फ़ाइलों के बहुत सारे, भ्रम हो करने के लिए विशेष रूप से अगर आप भी अन्य निर्देशिकाओं में की तरह "* .bin -merge" चीजों का उपयोग .bin फ़ाइलों के सभी मर्ज के लिए मजबूर करने के लिए बाध्य है अपने काम के पेड़ कचरा संघर्ष के साथ विफल करने के लिए। $ GIT_DIR/जानकारी/विशेषताओं इस प्रकार की चीज़ के लिए उपयोग करना बेहतर हो सकता है, क्योंकि इसकी उच्चतम प्राथमिकता है।

+0

आपके पास इतने सारे सबट्री हैं जिन्हें आप .gitattributes फ़ाइलों को नहीं चाहते हैं? और मुझे समझ में नहीं आ रहा है कि "भ्रम पैदा करने के लिए बाध्य है, खासकर यदि आप" * .bin -merge "भाग जैसी चीजों का भी उपयोग करते हैं। वैसे भी, दिलचस्प प्रतिक्रिया। +1 – VonC

+0

मेरे उद्देश्यों के लिए मेरे पास केवल एक सबट्री है - संपूर्ण रेपो ! लेकिन मैं सिद्धांत के आधार पर हूं। वे वर्कस्पेस को प्रदूषित करते हैं - मैंने सीवीएस और सबवर्जन के साथ काम किया है ताकि मैं अपनी फाइलों में टूल-विशिष्ट सीआर * पी डाल सकूं :-) – kbro

+0

भ्रम जो मैं बात कर सकता हूं अगर आप पहले से ही इस्तेमाल कर चुके हैं। gitattributes अन्य फ़ाइल प्रकारों के लिए कस्टम विलय क्रियाएं सेट अप करने के लिए, और फिर आप चीजों को एक प्रतिलिपि के लिए सेट अप करना चाहते हैं। प्राथमिकता फ़ाइलों को .gitattributes फ़ाइलों के लिए नियमों को देखते हुए, अपनी शीर्ष-स्तरीय निर्देशिका में डालें किसी भी निम्न-स्तरीय .gitattributes फ़ाइलों में सेटिंग को ओवरराइड नहीं करेगा। इसलिए आपको पहले डिफ़ॉल्ट-विलय वाली फ़ाइलों के लिए प्रतिलिपि मिल जाएगी, लेकिन आपको पहले से परिभाषित किए गए लोगों के लिए पिछली ओवरराइड कार्रवाई मिल जाएगी। निश्चित रूप से भ्रमित। – kbro

3

गिट के संस्करण 1.7.1 में, आप "उनकी" रणनीति को विलय और "-Xtheirs" तर्क के साथ पारित कर सकते हैं।

git merge -Xtheirs otherBranch

सुनिश्चित नहीं हैं कि यदि आप ऐसा करने के लिए कोशिश कर रहे हैं पर लागू होता है, लेकिन यह शायद एक शॉट के लायक है।

(भी this related question देखें)

+2

मुझे लगता है कि गिट विलय -एस रिकर्सिव-एक्स उनके अन्य ब्रंच – kbro

+0

'--strategy' और' - रणनीति-विकल्प 'बहुत अलग चीजें हैं। डाउनवोट करना होगा:/ – lkraav

3

इस समस्या में दूसरे दिन रैन:

http://seanius.net/blog/2011/02/git-merge-s-theirs/

git merge -s ours ref-to-be-merged 
git diff --binary ref-to-be-merged | git apply -R --index 
git commit -F .git/COMMIT_EDITMSG --amend 
+0

बस यह कोशिश की, काफी अच्छी तरह से काम करता है सिवाय इसके कि आप विलय को विशिष्ट पथों तक सीमित नहीं कर सकते हैं। लेकिन इसके अलावा यह बहुत अच्छा है –

0

अनुसंधान के एक टन के बाद, सभी एसओ शोर से गुजर रही है, और के बारे में जानने git फिर से (क्या यह कभी खत्म होता है?), मुझे विश्वास है कि यह उत्तर कस्टम --strategy theirs सिम प्राप्त करने के लिए सबसे शोर-मुक्त और इष्टतम तरीका है ulation मर्ज ड्राइवर। मांग पर प्रयोग योग्य, gitattributes कूड़े की आवश्यकता है।

मैं वास्तव में अभी भी थोड़ा विचित्र हूं कि यह --strategy theirs सिमुलेशन है, या सबसे आसान उपयोग करने योग्य checkout --theirs . संघर्ष समाधान विधि है। हो सकता है कि वे समकक्ष हों, लेकिन मुझे कुछ परिणाम ग्राफों को पूरी तरह समझने के लिए निदान करना होगा, जिनके लिए अभी कोई समय नहीं है।

प्रॉप्स @kbro सही बात ठीक विवरण का पीछा करते हुए कर रही है, और https://stackoverflow.com/a/1911370/35946

[git:master] में काफी करीब आ सुरक्षा प्रॉम्प्ट प्रदर्शन है।

सेटअप

$ [git:master] git config merge.theirs.name 'simulate `-s theirs`' 
$ [git:master] git config merge.theirs.driver 'cat %B > %A' # same as `mv` or `cp`, matter of taste 

उपयोग

$ [git:master] GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge develop 

बोनस: ALIAS

$ [git:master] git config alias.merge-theirs \!GIT_CONFIG_PARAMETERS=\""'"merge.default=theirs"'"\"\ git\ merge 

उपयोग: ALIAS

$ [git:master] git merge-theirs develop 

सूचना GIT_CONFIG_PARAMETERS के उद्धरण संरचना है, क्योंकि यह कई जटिल मूल्यों लेने के लिए सक्षम होना चाहिए। उस बोनस कमांड लाइन को प्राप्त करने के लिए प्रयास किया गया।

पुनश्च GIT_CONFIG_PARAMETERS एसओ पर सबसे अच्छा गुप्त रखा होना चाहिए, हम लगभग 2016 पूरे कर चुके हैं, https://stackoverflow.com/search?q=git_config_parameters 1 (एक) परिणाम (1)

संबंधित मुद्दे

 संबंधित मुद्दे