पैटर्न द्वारा पुन: फ़ाइलें जोड़ें


172

मैं अलग-अलग निर्देशिकाओं में स्थित पैटर्न (या ग्लोब) द्वारा फ़ाइलों को पुन: कैसे जोड़ सकता हूं?

उदाहरण के लिए, मैं एक आदेश के साथ A/B/C/foo.javaऔर D/E/F/bar.java(और कई अन्य जावा फ़ाइलें) जोड़ना चाहूंगा :

git add '*.java'

दुर्भाग्य से, यह उम्मीद के मुताबिक काम नहीं करता है।


2
यह मेरे लिए काम करता है (Mac OS X, Git 1.7.1+)। आप किस OS और Git संस्करण का उपयोग कर रहे हैं?
क्रिस जॉन्सन

3
यदि आपके पास .javaअपनी वर्तमान निर्देशिका में कुछ (पहले से ट्रैक की गई) फाइलें हैं, तो आप bash और msys कमांड-लाइन "हेल्पर" के बीच में, एर, जटिल वाइल्डकार्ड हैंडलिंग में चल सकते हैं । मैं एक समाधान के बारे में निश्चित नहीं हूं। आप उद्धरणों की कई परतों की कोशिश कर सकते हैं: git add '"*.java"'(एकल उद्धरण ग्लोब विस्तार को रोकने के लिए बैश द्वारा लिया जाता है , डबल कोट को एमएसबी परत द्वारा ग्लोब विस्तार को रोकने के लिए लिया जाता है)।
क्रिस जॉन्सन

1
नोट के लिए धन्यवाद। दुर्भाग्य से, यह भी काम नहीं करता है। वे कहते हैं कि तय हो गया है, लेकिन मेरे पास पहले से ही नवीनतम संस्करण है।
मिशेल क्रैमर


1
git add *.javaमेरे लिए काम करता है (GitHub क्लाइंट के साथ
शक्तियां पर

जवाबों:


89

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

git ls-files [path] | grep '\.java$' | xargs git add

Git इसे करने के लिए कोई फैंसी मेकेनिज्म प्रदान नहीं करता है, क्योंकि यह मूल रूप से एक शेल समस्या है: आपको दी गई कमांड के तर्क के रूप में प्रदान करने के लिए फ़ाइलों की सूची कैसे मिलती है।


8
धन्यवाद! मैंने आपकी आज्ञा को थोड़ा सुधार लिया है और अब मैं वही कर रहा हूँ जिसकी मुझे तलाश थी:git ls-files -co --exclude-standard | grep '\.java$' | xargs git add
मिशेल क्रैमर

169

आप git add [path]/\*.javaउप निर्देशिकाओं से जावा फ़ाइलों को जोड़ने के लिए उपयोग कर सकते हैं ,
उदाहरण के git add ./\*.javaलिए वर्तमान निर्देशिका।

से git addप्रलेखन :

निर्देशिका और उसकी उपनिर्देशिकाओं के *.txtतहत सभी फाइलों से सामग्री जोड़ता है Documentation:

$ git add Documentation/\*.txt

ध्यान दें कि तारांकन *इस उदाहरण में शेल से उद्धृत किया गया है; यह कमांड को डायरेक्टरी की उपनिर्देशिकाओं की फाइलों को शामिल करने देता है Documentation/


2
@ MichelKrämer शायद यह नहीं था, लेकिन यह अब है।
अल्बर्टो

7
यह सबसे अच्छा समाधान है, साथ ही खिड़कियों में काम करता है।
theTFo

1
"तारांकन * शैल से उद्धृत है"। मुझे लगता है कि आप "बच गए" का मतलब है। किसी भी मामले में, बैकस्लैश शेल को विस्तार करने से रोकता है।
जिविमेन

1
@gwideman मुझे लगता है कि आप सही हैं, लेकिन यह मैं नहीं हूं। यह डॉक्स git-scm.com/docs/git-add#_examples
सर्गेई

62

साथ zshआप चला सकते हैं:

git add "**/*.java"

और आपकी सभी *.javaफाइलें पुनरावर्ती रूप से जुड़ जाएंगी।


इसके लिए धन्यवाद, लेकिन मैं विंडोज पर msysgit के साथ काम कर रहा हूं और इसमें केवल बैश है।
मिशेल क्रैमर

1
खैर, मैं देखता हूं कि zshखिड़कियों के लिए एक खोल है ... आप अपने आप को इसे बैश, इमो के बजाय इसका उपयोग करने के लिए एक एहसान करेंगे।
ओलिवियर वर्डियर

1
Zsh का विंडोज पोर्ट एक बहुत पुराने संस्करण पर आधारित है और हर समय दुर्घटनाग्रस्त होता है (उदाहरण के लिए जब मैं प्रवेश करता हूं ls)।
मिशेल क्रैमर

वाह, एकदम सही। मैं उस सुविधा के बारे में नहीं जानता था!
टॉम वॉट्रूबा

1
इसका zsh से कोई लेना-देना नहीं है। मुझे लगता है कि यह उत्तर उस बिंदु को याद करता है जो आप वाइल्डकार्ड के साथ रास्ते को पारित करना चाहते हैं और इसे प्रक्रिया करने दें। इसलिए आप वाइल्डकार्ड (एस) के विस्तार से जो भी शेल का उपयोग कर रहे हैं उसे रोकना चाहते हैं। ऐसा करने के लिए आपको इसे किसी तरह से उद्धृत करने की आवश्यकता है जो आपके द्वारा उपयोग किए जा रहे शेल के लिए उपयुक्त है। विवरण के लिए अन्य उत्तर देखें।
gwideman

55

थोड़ा सा विषय (विशेष रूप से संबंधित नहीं), लेकिन अगर आप linux / unix पर हैं तो वर्कअराउंड हो सकता है:

find . -name '*.java' | xargs git add

और यदि आप रिक्त स्थान के साथ पथ की अपेक्षा करते हैं:

find . -name '*.java' -print0 | xargs -0 git add

लेकिन मुझे पता है कि जैसा आपने पूछा वैसा बिलकुल नहीं है।


6
इस दृष्टिकोण के साथ मामूली समस्या - यदि आपको ".ignignore" से मेल खाने वाली फ़ाइल "मिल जाती है" तो git को शिकायत है कि आप एक फ़ाइल जोड़ने की कोशिश कर रहे हैं जिसे आपने अनदेखा करने के लिए कहा था।
योयो

2
@yoyo - मैं तो बस अंत पर -f जोड़ा, और कहा कि कि तय
मस्लोव

5
@ मास्लो, जो जबरन फ़ाइल जोड़ देगा, भले ही इसे नजरअंदाज किया जाना था (.ignignore के आधार पर)। मैं शिकायत प्राप्त करना चाहूंगा और फ़ाइल नहीं जोड़ना चाहूंगा (जो कि डिफ़ॉल्ट व्यवहार है।)
yoyo

यह कैसे किसी भी तरह से वाइल्डकार्ड विस्तार प्रदर्शन करने से बेहतर है?
gwideman

12

सर्गेई का जवाब (मुझे क्रेडिट मत करो) काम कर रहा है:

You can use git add [path]/\*.java

एक हालिया गिट के साथ:

$git version
git version 1.7.3.4

परीक्षण के लिए फाइलें:

$find -name .git -prune -o -type f -print | sort
./dirA/dirA-1/dirA-1-1/file1.txt
./dirA/dirA-1/dirA-1-2/file2.html
./dirA/dirA-1/dirA-1-2/file3.txt
./dirA/dirA-1/file4.txt
./dirB/dirB-1/dirB-1-1/file5.html
./dirB/dirB-1/dirB-1-1/file6.txt
./file7.txt

Git स्थिति:

$git status -s
?? dirA/
?? dirB/
?? file7.txt

* .Txt जोड़ना:

$git add \*.txt

अद्यतन स्थिति:

$git status -s
A  dirA/dirA-1/dirA-1-1/file1.txt
A  dirA/dirA-1/dirA-1-2/file3.txt
A  dirA/dirA-1/file4.txt
A  dirB/dirB-1/dirB-1-1/file6.txt
A  file7.txt
?? dirA/dirA-1/dirA-1-2/file2.html
?? dirB/dirB-1/dirB-1-1/file5.html

8

यदि आप पहले से ही अपनी फ़ाइलों को ट्रैक कर रहे हैं और उनमें बदलाव किए हैं और अब आप उन्हें पैटर्न के आधार पर चुनिंदा रूप से जोड़ना चाहते हैं, तो आप --modifiedध्वज का उपयोग कर सकते हैं

git ls-files --modified | grep '<pattern>' | xargs git add

उदाहरण के लिए, यदि आप इस सीएसएस में केवल सीएसएस परिवर्तन जोड़ना चाहते हैं, तो आप कर सकते हैं

git ls-files --modified | grep '\.css$' | xargs git add

man git-ls-filesअधिक झंडे के लिए देखें


5

बस उपयोग करें git add *\*.java। यह रूट निर्देशिका और सभी उपनिर्देशिकाओं में सभी .java फाइलें जोड़ देगा।


बहुत बढ़िया जवाब। मैंने सभी फ़ाइलों के नाम pom.xml को जोड़ने के लिए git add * / pom.xml किया।
फिलिप रेगो

4

Windows कमांड लाइन समाधान जोड़ना जो अभी तक उल्लेख नहीं किया गया था:

for /f "delims=" %G in ('dir /b/s *.java') do @git add %G

3

मैं केवल उन फ़ाइलों को जोड़ना चाहता था जिनके आधार पर एक निश्चित स्ट्रिंग थी git status:

git status | grep string | xargs git add

और फिर git commit -m 'commit msgफ़ाइल के शीर्षक में "स्ट्रिंग" के साथ सभी परिवर्तित फ़ाइलों को करने में सक्षम था


2

जैसा कि " git: में उल्लेख किया गया है कि मैं एक निर्देशिका सबट्री में सभी फ़ाइलों को पुनरावर्ती कैसे जोड़ूं जो एक ग्लोब पैटर्न से मेल खाती हैं? ", यदि आप ठीक से बचते हैं या अपने pathspec ग्लोबिंग (जैसे '*.java') को उद्धृत करते हैं , तो हाँ, जोड़ दें'*.java'

Git 2.13 (Q2 2017) में सुधार होता है जो इंटरैक्टिव ऐड के लिए है:

जेफ किंग ( ) द्वारा 7288e12 (14 मार्च 2017) प्रतिबद्ध देखें । (द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 153e0d7 , 17 मार्च 2017)peff
gitster

add --interactive: के साथ pathspecs का विस्तार न करें ls-files

जब हम संशोधित फ़ाइलों की सूची प्राप्त करना चाहते हैं, तो हम पहले किसी भी उपयोगकर्ता द्वारा प्रदान किए गए pathspecs को " ls-files" के साथ विस्तारित करते हैं , और फिर परिणामी सूची को तर्क " diff-index" और " diff-files" के रूप में फीड करते हैं ।
यदि आपका पाथसेक बड़ी संख्या में पथों में विस्तारित होता है, तो आप दो समस्याओं में से एक में भाग ले सकते हैं:

  1. ओएस तर्क सूची के आकार के बारे में शिकायत कर सकता है, और चलाने से इनकार कर सकता है। उदाहरण के लिए:

    $ (ulimit -s 128 && git add -p drivers)
    Can't exec "git": Argument list too long at .../git-add--interactive line 177.
    Died at .../git-add--interactive line 177.
    

यह linux.gitरिपॉजिटरी पर है, जिसमें "ड्राइवरों" निर्देशिका में लगभग 20K फाइलें हैं (उनमें से कोई भी इस मामले में संशोधित नहीं हुआ है)। ulimit -sऐसे विशाल रास्तों के लिए भी लिनक्स पर समस्या दिखाने के लिए " " ट्रिक आवश्यक है।
अन्य ऑपरेटिंग सिस्टमों की सीमाएँ बहुत कम होती हैं (उदाहरण के लिए, OS X पर केवल 5K फ़ाइलों के साथ एक वास्तविक दुनिया का मामला देखा गया था)।

  1. यहां तक ​​कि जब यह काम करता है, तो यह वास्तव में धीमा है। Pathspec कोड भारी संख्या में पथों के लिए अनुकूलित नहीं है। यहाँ ulimit के बिना एक ही मामला है:

    $ time git add -p drivers
      No changes.
    
    real  0m16.559s
    user    0m53.140s
    sys 0m0.220s
    

हम इसे ls-filesपूरी तरह से स्किप करके " " सुधार कर सकते हैं , और मूल पाथसेक को अलग-अलग कमांड में खिला सकते हैं।

ऐतिहासिक रूप से " diff-index" द्वारा समर्थित पैथस्पेक भाषा कमजोर थी, लेकिन अब ऐसा नहीं है।


1

~ / .itconfig में लाइन लगाएं

[alias] addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -

यदि आप सभी संशोधित जावा फ़ाइल को जोड़ना चाहते हैं तो बस कर सकते हैं: git addt java

संक्षेप में, यदि आप सभी संशोधित अजगर फ़ाइल को जोड़ना चाहते हैं, तो बस कर सकते हैं: git addt py

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