Git - मर्ज के दौरान फ़ाइलों को अनदेखा करें


114

मेरे पास myrepoरिमोट beanstalkसर्वर पर एक रेपो है।

मैंने इसे अपनी स्थानीय मशीन पर क्लोन किया। दो अतिरिक्त शाखाएँ बनाई गईं: stagingऔर dev। इन शाखाओं को दूरस्थ रूप में भी धकेल दिया।

अभी:

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

मेरे पास एक फाइल है config.xmlजो प्रत्येक शाखा पर अलग है।

मैं केवल मर्ज के दौरान इस फ़ाइल को अनदेखा करना चाहता हूं। लेकिन मैं चाहता हूं कि इसे तब शामिल किया जाए जब मैं / से रेपो शाखा में चेकआउट या कमिटमेंट करूं।

मेरे द्वारा यह चाहने का कारण है, हमारे पास एक परिनियोजित स्क्रिप्ट है जो विशिष्ट शाखा को खींचती है और संबंधित सर्वरों पर तैनात करती है। तो हमें config.xmlउस विशिष्ट शाखा की फ़ाइल की आवश्यकता होती है जो विशिष्ट सर्वर में जाती है जैसा कि ऊपर संकेतित होने पर तैनात किया जाता है।

मुझे लगता है .gitignoreअभ्यस्त काम। अन्य विकल्प क्या हैं? ध्यान दें कि अनदेखा फ़ाइल चेकआउट और प्रतिबद्ध का हिस्सा होना चाहिए, जो महत्वपूर्ण है। इसे केवल मर्ज के दौरान अनदेखा किया जाना चाहिए।

धन्यवाद!


इसके डिफॉल्ट मोड में, git fetch के लिए git pull शॉर्टहैंड होता है, इसके बाद git मर्ज FETCH_HEAD होता है। तो आप एक दूसरे के साथ तरह तरह के टकराव करते हैं।
zzk 19

खैर, मैं कहूंगा, इसका चेकआउट। नहीं खींचा। मैं प्रश्न को स्पष्ट करने के लिए अपडेट करूंगा।
केविन रवे


2
क्या आपको कभी इसका कोई हल मिला? git विशेषताएँ केवल उस स्थिति के लिए उपयोगी होती हैं जहाँ फ़ाइल का विलय होने वाली शाखाओं के बीच टकराव होता है, इसलिए यह हमेशा पर्याप्त नहीं होता है।
पिविस

क्या आपने प्रतीकात्मक (जीआईटी द्वारा पीछा नहीं किया) या बचाव के लिए कठिन लिंक को देखा?
फ्रैंक नॉक

जवाबों:


94

मैंने --no-commitविकल्प के साथ git मर्ज कमांड का उपयोग करके इस मुद्दे पर काबू पा लिया और फिर स्पष्ट रूप से चरणबद्ध फ़ाइल को हटा दिया और फ़ाइल में परिवर्तनों को अनदेखा कर दिया। उदाहरण: कहते हैं कि मैं अपने द्वारा किए गए परिवर्तनों को अनदेखा करना चाहता myfile.txtहूं:

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

आप लूप के लिए 2 और 3 स्टेटमेंट डाल सकते हैं, अगर आपके पास स्किप करने के लिए फाइलों की सूची है।


2
यदि आप चाहते हैं कि जब तेज-फॉरवर्ड स्ट्रेटेजी में मर्ज होता है, तो आप "--no-ff" जोड़ेंगे।
Ilia Shakitko

1
तो git reset HEAD myfile.txtवास्तव में क्या करता है? यह हमारे लक्ष्य के साथ यहाँ कैसे मदद करता है?
किड_लर्निंग_सी।

आप लूप में 2 और 3 लाइन कैसे डालते हैं?
एंड्राइडडेव

52

मैंने खोजबीन शुरू की attributes। कोशिश कर रहा हूं। अब तक काम कर रहे हैं। अभी तक सभी परिदृश्यों की जाँच नहीं की। लेकिन इसका समाधान होना चाहिए।

मर्ज रणनीतियाँ - गिट विशेषताएँ


4
लेकिन मुझे यह git-scm.com/book/ch7-2.html#Merge-Strategies
Nate-

1
यहाँ git विशेषताएँ डॉक्स के मर्ज रणनीतियों अनुभाग के लिए सही लिंक दिया गया है: git-scm.com/book/en/v2/…
Adrian

3
मिले यह अच्छी तरह से एक लेख में बताया गया है medium.com/@porteneuve/...
ShawnFeatherly

10
यह एक समस्या लगती है अगर कोई टकराव नहीं हैं? फ़ाइलें अभी भी मर्ज की जाएंगी?
ब्रेट

18

.gitattributes - आपकी रिपॉजिटरी की एक रूट लेवल फाइल है, जो फाइलों के सबडायरेक्ट या सब्मिट के लिए विशेषताओं को परिभाषित करती है।

आप विशिष्ट फ़ाइल के लिए विभिन्न मर्ज रणनीतियों का उपयोग करने के लिए गिट को बताने के लिए विशेषता निर्दिष्ट कर सकते हैं। यहां, हम config.xmlअपनी शाखा के लिए मौजूदा को संरक्षित करना चाहते हैं । हम निर्धारित करने की आवश्यकता merge=oursके लिए config.xmlमें .gitattributesफ़ाइल।

merge=ours यदि मर्ज संघर्ष होता है, तो हमारे (वर्तमान शाखा) फ़ाइल का उपयोग करने के लिए गिट को बताएं।

  1. .gitattributesरिपॉजिटरी के मूल स्तर पर एक फ़ाइल जोड़ें

  2. आप .gitattributesफ़ाइल में confix.xml के लिए एक विशेषता सेट कर सकते हैं

    config.xml merge=ours
    
  3. और फिर एक डमी को परिभाषित करें हमारी रणनीति के साथ मर्ज करें:

    $ git config --global merge.ours.driver true
    

यदि आप stagफॉर्म devशाखा को मर्ज करते हैं, तो config.xml फ़ाइल के साथ मर्ज संघर्ष होने के बजाय, मूल रूप से आपके पास जो भी संस्करण है, स्टैग शाखा के config.xml को संरक्षित करें।


16
लेकिन अगर संघर्ष न हो तो क्या होगा? मर्ज के दौरान हमेशा एक निश्चित फ़ाइल कैसे रखें?
इगोर यलोवॉय

2
@IgorYalovoy: यदि कोई विरोधाभास नहीं होगा ... अच्छी तरह से, यह एक छोटे से मुश्किल के रूप में यह वास्तव में हैश आईडी से काम करता है, लेकिन: अगर config.xmlहै पूरी तरह से अपरिवर्तित या तो शाखा टिप संस्करण में मर्ज आधार से, Git सिर्फ बदला गया वर्शन लेता है, बिना merge.ours.driverसेटिंग देख रहे हैं। इसलिए आप चिंतित होना सही है।
torek

1
Git डॉक्स से कॉपी-पेस्ट: मर्ज स्ट्रैटेजीज़ - Git विशेषताएँ। लिंक
kyb

यह विधि हर बार FYI करें "मर्ज कमिट्स" में परिणाम करती है।
19

2
"हमारी" नई रणनीति के लिए एक मनमाना नाम प्रतीत होता है। मुझे यह भ्रामक लगा, क्योंकि theirsयह एक अंतर्निहित मर्ज रणनीति है। लेकिन ऐसा लगता है कि एक लिख सकते हैं <pattern> merge=foo, तो git config --global merge.foo.driver true, और यह उसी तरह काम करेंगे।
काइल स्ट्रैंड

8

आप का उपयोग करके शुरू कर सकते हैं git merge --no-commit, और फिर मर्ज को संपादित करें जो आपको पसंद है, जैसे कि अस्थिर config.xmlया किसी अन्य फ़ाइल के द्वारा, फिर कमिट करें। मुझे लगता है कि आप हुक का उपयोग करने के बाद इसे और अधिक स्वचालित करना चाहते हैं, लेकिन मुझे लगता है कि यह कम से कम एक बार मैन्युअल रूप से गुजरने लायक होगा।


2
git attributesकोई सीधा समाधान प्रदान करता है ? मैं यह नहीं समझ पा रहा हूं। git-scm.com/book/en/…
केविन रवे

4

आप रिपॉजिटरी .gitignoreसे config.xmlबाहर रखने के लिए उपयोग कर सकते हैं , और फिर सर्वर पर उपयुक्त फ़ाइल अपलोड करने के लिए पोस्ट कमिट हुक का उपयोग कर सकते हैं config.xml


1
मुझे पता है कि हैक की तरह। मैं एक साफ समाधान खोजने की कोशिश कर रहा हूं। Git के बारे में क्या attributes। किसी भी विचार यह कैसे काम करता है? मैं यह नहीं समझ पा रहा हूं। git-scm.com/book/en/…
केविन रवे

1
मैंने इनमें से नहीं सुना है, मैं मर्ज लगाने की कोशिश कर रहा हूं = हमारी विशेषता, आशाजनक लग रहा है।
tlehman

1
Git विशेषताएँ कमाल की हैं! आप गैर-पाठ फ़ाइलों को अलग करने का तरीका भी बता सकते हैं, इसलिए आप PDF को अलग करने के लिए PDF2text का उपयोग कर सकते हैं!
tlehman

2

उदाहरण:

  1. आप दो शाखाएं हैं: master,develop
  2. आपने developशाखा में फ़ाइल बनाई और विलय करते समय इसे अनदेखा करना चाहते हैं

कोड:

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

आप समान एक्सटेंशन वाली फ़ाइलों को भी अनदेखा कर सकते हैं

उदाहरण के लिए .txtएक्सटेंशन वाली सभी फाइलें :

echo "*.txt merge=ours" >> .gitattributes

1

यहाँ git-update-index - कार्यशील ट्री में फ़ाइल सामग्री को इंडेक्स में रजिस्टर करें।

git update-index --assume-unchanged <PATH_OF_THE_FILE>

उदाहरण:-

git update-index --assume-unchanged somelocation/pom.xml


यह अच्छा है जब धक्का लेकिन अभी भी शिकायत है जब खींच फ़ाइल अधिलेखित हो सकता है।
रॉल्फ

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