स्थानीय परिवर्तन रखते हुए गिट पुल


132

मैं विशिष्ट प्रोजेक्ट्स को सुरक्षित रखने (पुल) को कैसे सुरक्षित कर सकता हूं, विशिष्ट फ़ाइलों को अछूता रखते हुए, भले ही अपस्ट्रीम परिवर्तन हो?

myrepo / config / config.php

क्या कोई तरीका है, भले ही यह फ़ाइल रिमोट पर बदली जा रही हो, जब मैं खींचता हूं, तो बाकी सब कुछ अपडेट किया जाता है, लेकिन यह फ़ाइल अपरिवर्तित है (विलय नहीं हुई है)?

पुनश्च। मुझे वह करने की आवश्यकता है जो मैं पूछ रहा हूं क्योंकि मैं केवल गिट आधारित तैनाती स्क्रिप्ट लिख रहा हूं। मैं कॉन्फ़िगर फ़ाइलों को टेम्प्लेट में नहीं बदल सकता।

इसलिए, मुझे अपडेट स्क्रिप्ट लिखने का तरीका चाहिए जो स्थानीय रूप से बदल गया था जो नहीं खोता है। मैं कुछ के रूप में सरल के लिए उम्मीद कर रहा था:

git assume-remote-unchanged file1
git assume-remote-unchanged file2

फिर git pull


क्या बदलाव के लिए config.phpप्रतिबद्ध हैं?
मार्क लोंगेयर


यह प्रतिबद्ध नहीं है। मैं नहीं बल्कि
जॉनी एवरसन

@ जॉननीसन: यह समस्या का एक ही समग्र वर्ग है (आपके पास कॉन्फ़िगरेशन फ़ाइल है और आप विशिष्ट सेटिंग्स नहीं करना चाहते हैं, लेकिन कॉन्फ़िगरेशन फ़ाइल संरचना को ट्रैक करने की आवश्यकता है।)
Daenyth

जवाबों:


248

Git stash पर आधारित एक सरल उपाय है। सब कुछ है कि आप बदल गए हैं, सभी नए सामान खींच, अपने छिपाने की जगह लागू करें।

git stash
git pull
git stash pop

स्टैश पॉप पर संघर्ष हो सकता है। आपके द्वारा वर्णित मामले में वास्तव में एक संघर्ष होगाconfig.php । लेकिन, संघर्ष को हल करना आसान है क्योंकि आप जानते हैं कि आप जो चाहते हैं उसे स्टैश में रखें। तो ऐसा करें:

git checkout --theirs -- config.php

5
कि git checkout - उनकी कमांड बहुत ही भ्रामक है। यह वही है जो मैं एक बार चाहता था और कुछ और वास्तव में बुरा था। उस पर कोई अच्छा प्रलेखन मिला?
मिलीमीटर

3
हां, कभी-कभी 'उनका' और 'हमारा' भ्रम हो सकता है। एक में git merge'हमारा' क्या कार्यशील निर्देशिका में है है। लेकिन git rebase(या git rebase -onto) के लिए अर्थ की अदला-बदली हो सकती है।
गोजोनर

1
git stash , git pull , git stash apply आप के साथ git stash drop
संघर्ष

11
गिट के साथ बात यह है कि आपको यह समझना होगा कि यह क्या करने जा रहा है। Git के साथ दूसरी बात यह है कि स्मार्ट लोगों के लिए भी यह समझना बहुत मुश्किल है कि git क्या करने जा रहा है।
ब्रैड थॉमस

1
आपको जांचना चाहिए कि क्या वास्तव में कोई चीज है या नहीं। अन्यथा आप पहले से किए गए परिवर्तनों को रोक देंगे git stash
जोर्न रिम्सर्ड्स

15

यदि आपके पास अपने रेपो में एक फ़ाइल है कि इसे अधिकांश खींचने वालों द्वारा अनुकूलित किया जाना है, तो फ़ाइल को कुछ इस तरह से नाम बदलें config.php.templateऔर config.phpअपने में जोड़ें .gitignore


5
इस उत्तर को भी जांचें , आप .gitattributesमर्ज करते समय हमेशा अपने परिवर्तनों को रखने के लिए उपयोग कर सकते हैं ।
कुर्दिम मेटल

यह वैसा ही है जैसा मुझे चाहिए था। टेम्पलेट की बात सुरुचिपूर्ण समाधान है, लेकिन मुझे डर है कि मैं इसका उपयोग नहीं कर सकता क्योंकि मैं सिर्फ स्क्रिप्ट लिख रहा हूं।
जॉनी एवरसन

6

अद्यतन: यह शाब्दिक रूप से पूछे गए प्रश्न का उत्तर देता है , लेकिन मुझे लगता है कि कुर्ज्डमेटल का उत्तर वास्तव में आप क्या चाहते हैं।

मानाकि:

  1. तुम शाखा पर हो master
  2. अपस्ट्रीम ब्रांच masterमें हैorigin
  3. आपके पास कोई भी अनपेक्षित परिवर्तन नहीं है

.... तुम यह कर सकते थे:

# Do a pull as usual, but don't commit the result:
git pull --no-commit

# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php

# Create the commit:
git commit -F .git/MERGE_MSG

आप इसके लिए एक उपनाम बना सकते हैं यदि आपको इसे अक्सर करने की आवश्यकता है। ध्यान दें कि यदि आपने परिवर्तन नहीं किए हैं config/config.php, तो यह उन्हें फेंक देगा।



1

प्रश्न का उत्तर देने के लिए: यदि आप किसी चेकआउट की कुछ फ़ाइलों को बाहर करना चाहते हैं, तो आप स्पार्स-चेकआउट का उपयोग कर सकते हैं

1) में .git/info/sparse-checkout, परिभाषित करें कि आप क्या रखना चाहते हैं। यहां, हम सभी (*) चाहते हैं, लेकिन (विस्मयादिबोधक चिह्न पर ध्यान दें) config.php:

 /*
 !/config.php

2) बता दें कि आप स्पार्स-चेकआउट को ध्यान में रखना चाहते हैं

 git config core.sparseCheckout true

3) यदि आपको पहले से ही यह फ़ाइल स्थानीय रूप से मिल गई है, तो वह करें जो एक विरल चेकआउट पर करता है (यह बताएं कि उस पर "स्किप-वर्कट्री" ध्वज सेट करके इस फ़ाइल को बाहर करना होगा)

git update-index --skip-worktree config.php

4) एक रिपॉजिटरी का आनंद लें जहां आपकी config.php फ़ाइल आपकी है - रिपॉजिटरी में जो भी बदलाव हैं।


कृपया ध्यान दें कि कॉन्फ़िगरेशन मान SHOULDN'T स्रोत नियंत्रण में होगा:

  • यह संभावित सुरक्षा उल्लंघन है
  • यह तैनाती के लिए इस तरह की समस्याओं का कारण बनता है

इसका मतलब है कि आपको उन्हें बाहर करना होगा (उन्हें पहले प्रतिबद्ध करने के लिए .itignore में डाल दें), और प्रत्येक उदाहरण पर उपयुक्त फ़ाइल बनाएं जहां आप अपने ऐप को चेकआउट करते हैं ("टेम्पलेट" फ़ाइल को कॉपी और एडैप करके)

ध्यान दें कि, एक बार फाइल को git द्वारा चार्ज करने के बाद, .ignignore पर कोई प्रभाव नहीं पड़ेगा।

यह देखते हुए कि एक बार फ़ाइल स्रोत नियंत्रण में होने के बाद, आपके पास केवल दो विकल्प होते हैं (): - फ़ाइल को निकालने के लिए अपने सभी इतिहास को फिर से सेट करें (साथ में git filter-branch) - फ़ाइल को निकालने वाली एक कमिट बनाएँ। यह एक हारने वाली लड़ाई लड़ने जैसा है, लेकिन, ठीक है, कभी-कभी आपको उसी के साथ रहना पड़ता है।


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