एक फ़ाइल को छोड़कर सभी फ़ाइलों को एक प्रतिबद्ध में जोड़ें?


569

मेरे पास एक बदलाव में फ़ाइलों का एक गुच्छा है, लेकिन मैं विशेष रूप से एक एकल संशोधित फ़ाइल को अनदेखा करना चाहता हूं। इस तरह दिखता है git status:

# modified:   main/dontcheckmein.txt
# deleted:    main/plzcheckmein.c
# deleted:    main/plzcheckmein2.c
...

क्या कोई ऐसा तरीका है जो मैं कर सकता हूं git addलेकिन सिर्फ एक पाठ फ़ाइल को अनदेखा करें जिसे मैं स्पर्श नहीं करना चाहता हूं? कुछ इस तरह:

git add -u -except main/dontcheckmein.txt

जवाबों:


850
git add -u
git reset -- main/dontcheckmein.txt

28
मैं संपूर्ण फ़ोल्डर को कैसे निकालूं? - मुख्य या मुख्य / या मुख्य / *?
एलन कोरोमेनो

8
@MariusKavansky आप इन सभी रूपों का उपयोग कर सकते हैं। यदि आप इसका उपयोग करते हैं, main/*तो --यह बताने के लिए आवश्यक है कि यह एक रास्ता है। अन्य दो संस्करण दो डैश को शामिल किए बिना काम करते हैं। (MsysGit के साथ विंडोज 7 पर कमांड प्रॉम्प्ट में परीक्षण किया गया)
dennisschagt

2
यदि आपके पास कुछ फ़ोल्डर्स हैं जिन्हें आप बाहर करना चाहते हैं जिसमें बड़ी मात्रा में फाइलें या अन्य फ़ोल्डर शामिल हैं: अस्थायी रूप से उन्हें अपने गिगिनटोर में जोड़ें। git resetबाद में उन फ़ोल्डरों के लिए प्रदर्शन करना अभी भी काम करेगा, लेकिन बड़े फ़ोल्डरों को जोड़ने में एक लंबा समय लगेगा।
माइकल ट्रू

2
तो, वहाँ कोई एक लाइनर है?
ब्राविक

5
@ जैक्सन प्रत्येक पंक्ति पर टिप्पणी करना अच्छा होगा, क्या आपको नहीं लगता?
ed1nh0

140

1) एक पहले से ही संस्करण फ़ाइल में परिवर्तन की अनदेखी शुरू करने के लिए

git update-index --assume-unchanged "main/dontcheckmein.txt"

और इसे पूर्ववत करें git update-index --no-assume-unchanged "main/dontcheckmein.txt"

फ़ाइलों को अनदेखा करने के लिए github डॉक्स

2) एक विशिष्ट एकल फ़ाइल को पूरी तरह से अनदेखा करने के लिए इसे रिपॉजिटरी में बनाए जाने से रोकता है

सबसे पहले, इस स्टैकओवरफ़्लो पोस्ट को देखें: काम न करने की वैश्विक उपेक्षा

में .gitignore, प्रमुख के बिना फ़ाइल के सापेक्ष पथ को जोड़ने ./

तो, अगर आपकी फ़ाइल में है MyProject/MyFolder/myfile.txt, (जहां .gitमें भी है MyProjectफ़ोल्डर), जोड़ने MyFolder/myfile.txtपर अपने को .gitignoreफ़ाइल।

आप इस बात की पुष्टि कर सकते हैं कि किन नियमों की अनदेखी के साथ जुड़े हैं git check-ignore "MyFolder/myfile.txt"

वैश्विक अनदेखी के बारे में

वह लिंक के बारे में बात करता है ~/.gitignore_global, लेकिन फ़ाइल आपके प्रोजेक्ट से संबंधित है। तो, यदि आप बाहर रखा पैटर्न MyFolder/myfile.txtमें ~/.gitignore_global, यह काम करेगा, लेकिन बहुत मतलब नहीं होगा ...

दूसरी ओर, यदि आप सेटअप के साथ अपनी परियोजना git config core.excludesfile .gitignoreजहां .gitignoreमें है MyProject, स्थानीय फाइल को पार कर जाएगी ~/.gitignore_global, हो सकता है जो बहुत ही उपयोगी नियम ...

तो, अब के लिए, मुझे लगता है कि यह अपने मिश्रण करने कुछ स्क्रिप्ट बनाने के लिए सबसे अच्छा है .gitignoreसाथ ~/.gitignore_globalमें .gitignore

एक अंतिम चेतावनी
यदि आप जिस फ़ाइल को अनदेखा करना चाहते हैं वह पहले से ही रिपॉजिटरी में है, तो यह विधि तब तक काम नहीं करेगी जब तक आप ऐसा नहीं करते हैं: git rm "MyFolder/myfile.txt"लेकिन इसे पहले वापस कर दें, क्योंकि यह स्थानीय रूप से भी हटा दी जाएगी! आप इसे बाद में वापस कॉपी कर सकते हैं ...


5
आप git rm --cached MyFolder/myyfile.txtफ़ाइल को रिपॉजिटरी से निकालने के लिए उपयोग कर सकते हैं लेकिन इसे स्थानीय स्तर पर रख सकते हैं। Help.github.com पर स्पष्टीकरण
dennisschagt

87

एक फ़ाइल के लिए

git add -u
git reset -- main/dontcheckmein.txt

एक फ़ोल्डर के लिए

git add -u
git reset -- main/*

9
क्यों -यू आवश्यक है? क्यों नहीं git add . && git reset -- main/*?

2
-U विकल्प इंडेक्स को वहीं अपडेट करता है, जहां पहले से ही एक एंट्री है जो <pathspec> से मेल खाता है। यह हटाता है और साथ ही साथ कार्यशील पेड़ से मिलान करने के लिए सूचकांक प्रविष्टियों को संशोधित करता है, लेकिन कोई नई फ़ाइल नहीं जोड़ता है। यदि -u विकल्प का उपयोग करने पर कोई <pathspec> नहीं दिया जाता है, तो पूरे काम करने वाले पेड़ में सभी ट्रैक की गई फ़ाइलें अपडेट की जाती हैं (वर्तमान निर्देशिका और उसके उपनिर्देशिकाओं के लिए अद्यतन को सीमित करने के लिए उपयोग किए गए गिट के पुराने संस्करण)।
फरहाद ममदली

6
क्या कोई समझा सकता है कि -u भाषा में क्यों आवश्यक है कि गैर-गिट पेशेवरों को समझ में आएगा?
पैट्रिक

2
-u का उपयोग आपकी वर्तमान शाखा को संदर्भित करने के लिए किया जाता है जिसे आप पुश कर रहे हैं। अब आपको git push origin masterअपने अगले पुश में टाइप करने की आवश्यकता नहीं होगी , बस git pushऔर गिट को पता चल जाएगा कि यह मास्टर ब्रांच में है। आशा है ये मदद करेगा।
पेपेंग हापोन

69

अब pathspec जादू और इसके छोटे रूप gitका समर्थन करता exclude certain paths and filesहै । तो आप इसे निम्न कमांड के रूप में आसानी से प्राप्त कर सकते हैं।:(exclude):!

git add --all -- :!main/dontcheckmein.txt
git add -- . :!main/dontcheckmein.txt

वास्तव में आप अधिक निर्दिष्ट कर सकते हैं:

git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
git add -- . :!path/to/file1 :!path/to/file2 :!path/to/folder1/*

1
सबसे अच्छा जवाब, धन्यवाद! कम से कम, मेरे मामले के लिए: मुझे केवल एक फ़ाइल प्रकार को बाहर करने की आवश्यकता थी।
आंद्रे पॉलीकिनिन

15
यह उत्कृष्ट है! ध्यान दें कि लिनक्स पर, आपको :!...शेल को शिकायत करने से रोकने के लिए उद्धृत करने की आवश्यकता है । इसलिए, उदाहरण के लिए git add --all -- ':!path/to/file1' ':!path/to/file2' ':!path/to/folder1/*':।
मार्टिन_डब्लू

क्या कुछ ऐसा है :!/path/to/(file1|file2)?
साधक_ऑफ_बाकन

यह zsh में कुछ के साथ टकराता है, मेरे लिए macOS और नवीनतम git पर काम नहीं करता है।
मर्लिन

1
क्या कोई यह इंगित कर सकता है कि यह आधिकारिक रूप से दस्तावेज कहां है?
समुराई_जाने

20

जबकि बेन जैक्सन सही है, मैंने सोचा कि मैं जोड़ूंगा कि मैं उस समाधान का उपयोग कैसे कर रहा हूं। नीचे एक बहुत ही सरल स्क्रिप्ट है जिसका उपयोग मैं करता हूं (जिसे मैं gitadd कहता हूं) कुछ चुनिंदा को छोड़कर सभी परिवर्तनों को जोड़ने के लिए जिसे मैं एक फाइल में सूचीबद्ध रखता हूं .gittrackignore(बहुत ही समान है। कैसे काम करता है।)।

#!/bin/bash
set -e

git add -A
git reset `cat .gittrackignore`

और यह मेरा वर्तमान .gittrackignoreजैसा दिखता है।

project.properties

मैं एक एंड्रॉइड प्रोजेक्ट पर काम कर रहा हूं जिसे मैं तैनात करते समय कमांड लाइन से संकलित करता हूं। यह प्रोजेक्ट शेरलाकेशनबेर पर निर्भर करता है, इसलिए इसे प्रोजेक्ट.प्रॉपरेटी में रेफर किया जाना चाहिए, लेकिन यह कंप्लेन के साथ गड़बड़ी करता है, इसलिए अब मैं सिर्फ टाइप करता हूं gitaddऔर बिना बदलाव के सभी बदलावों को जोड़ देता हूं । हर बार अन-एड प्रॉजेक्ट्स को एड-ऑफ किए बिना।


मुझे नहीं पता --था कि आपकी टिप्पणी तक क्या था। पुरुष पृष्ठों के अनुसार, इसका वैकल्पिक और कमांड के परिणाम को नहीं बदलता है (कम से कम इस मामले में)। इस सवाल का समर्थन करने के लिए लगता है कि, stackoverflow.com/questions/17800994/… । अगर मैं गलत हूं तो मुझे सुधारो, लेकिन ऐसा लगता है कि इसका मतलब है "कुछ भी --तर्क के रूप में व्यवहार करें, विकल्प / स्विच नहीं"
एंथनी नाडदेव

उस प्रश्न --में git checkoutमुझे अच्छा उपयोग दिखाई देता है। मुझे नहीं पता था कि हमारे इस बदले तक डबल डैश क्या था। मुझे आश्चर्य है कि अगर git checkoutशाखाओं या फाइलों के बीच अस्पष्टता इस या एक अलग रूप में git resetभी प्रभावित हो सकती है ।
Giulio Piancastelli

10

फ़ाइल में परिवर्तन रखने के लिए, लेकिन ऐसा करने के लिए मैंने ऐसा नहीं किया

git add .

git reset -- main/dontcheckmein.txt

git commit -m "commit message"

फ़ाइल को सत्यापित करने के लिए बाहर रखा गया है

git status


4

git add -Aएक बार में सभी संशोधित और नई जोड़ी गई फ़ाइलों को जोड़ने के लिए उपयोग करें ।

उदाहरण

git add -A
git reset -- main/dontcheckmein.txt



1

प्रश्न में विशिष्ट मामले के लिए, .c एक्सटेंशन के साथ सभी फ़ाइलों को जोड़ने और बाकी सब चीजों को छोड़ने का सबसे आसान तरीका होगा :

git add *.c

से Git-SCM (या / और man git add):

git add <pathspec> ...

से सामग्री जोड़ने के लिए फ़ाइलें। Fileglobs (उदा। * .C) सभी मिलान फ़ाइलों को जोड़ने के लिए दिया जा सकता है। <...>

ध्यान दें कि इसका मतलब है कि आप भी कुछ ऐसा कर सकते हैं:

git add **/main/*

सभी फ़ाइलों को जोड़ने के लिए (जिसे अनदेखा नहीं किया गया है) mainफ़ोल्डर में हैं। तुम भी अधिक विस्तृत पैटर्न के साथ जंगली जा सकते हैं:

git add **/s?c/*Service*

ऊपर उन सभी फ़ाइलों को जोड़ा जाएगा जो s(any char)cफ़ोल्डर में हैं और Serviceउनके फ़ाइलनाम में कहीं है।

जाहिर है, आप प्रति आदेश एक पैटर्न तक सीमित नहीं हैं। है, आप का ही विस्तार है कि सभी फाइलों को जोड़ने के लिए Git पूछ सकते और :

git add *.c *.h

यह लिंक आपको कुछ और ग्लोब पैटर्न विचार दे सकता है।

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

वैसे, आपको उन्हें काम करने के लिए अपने ग्लोब पैटर्न को कोट करने की आवश्यकता हो सकती है, लेकिन मेरे लिए ऐसा कभी नहीं हुआ था।


0

मैं git add --patchकाफी थोड़ा का उपयोग करता हूं और चाहता था कि इस तरह की dफाइलों के माध्यम से हर समय हिट होने से बचें । मैंने काम करने के लिए गिट एलियाज़ के एक बहुत ही हैकडी जोड़े को मार दिया:

[alias]
    HELPER-CHANGED-FILTERED = "!f() { git status --porcelain | cut -c4- | ( [[ \"$1\" ]] && egrep -v \"$1\" || cat ); }; f"
    ap                      = "!git add --patch -- $(git HELPER-CHANGED-FILTERED 'min.(js|css)$' || echo 'THIS_FILE_PROBABLY_DOESNT_EXIST' )"

मेरे मामले में मैं बस हर समय कुछ निश्चित फाइलों को अनदेखा करना चाहता था, लेकिन आप इसे $GIT_EXCLUDE_PATTERNअधिक सामान्य उपयोग के मामले की तरह पर्यावरण चर का उपयोग कर सकते हैं ।



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