Recursief bestanden toevoegen volgens patroon

Hoe voeg ik recursief bestanden toe aan de hand van een patroon (of glob) in verschillende mappen?

Ik wil bijvoorbeeld A/B/C/foo.javaen D/E/F/bar.java(en verschillende andere java bestanden) met één commando:

git add '*.java'

Helaas werkt dat niet zoals verwacht.


Antwoord 1, autoriteit 100%

Je kunt git add [path]/\*.javagebruiken om Java-bestanden uit submappen toe te voegen,
bijv. git add ./\*.javavoor huidige map.

Van git adddocumentatie:

Voegt inhoud toe van alle *.txtbestanden onder de Documentationdirectory en zijn subdirectories:

$ git add Documentation/\*.txt

Merk op dat de asterisk *in dit voorbeeld uit de shell wordt geciteerd; hierdoor kan het commando de bestanden van subdirectories van de Documentation/directory opnemen.


Antwoord 2, autoriteit 54%

Sergio Acosta’s antwoordis waarschijnlijk de beste keuze als sommige van de toe te voegen bestanden mogelijk nog niet worden bijgehouden. Als je jezelf wilt beperken tot bestanden die git al kent, kun je git-ls-filescombineren met een filter:

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

Git biedt geen fancy mechanismen om dit zelf te doen, omdat het in feite een shell-probleem is: hoe krijg je een lijst met bestanden die je als argumenten voor een bepaald commando kunt geven.


Antwoord 3, autoriteit 39%

Met zshkun je het volgende uitvoeren:

git add "**/*.java"

en al uw *.javabestanden worden recursief toegevoegd.


Antwoord 4, autoriteit 32%

Een beetje off-topic (niet specifiek git-gerelateerd) maar als je op linux/unix werkt, zou een tijdelijke oplossing kunnen zijn:

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

En als u paden met spaties verwacht:

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

Maar ik weet dat dat niet precies is wat je vroeg.


Antwoord 5, autoriteit 6%

Sergey’s antwoord(vermeld mij niet) werkt:

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

met een recente git:

$git version
git version 1.7.3.4

Bestanden voor de test:

$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-status:

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

*.txt toevoegen:

$git add \*.txt

Status bijgewerkt:

$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

Antwoord 6, autoriteit 5%

Als u uw bestanden al bijhoudt en er wijzigingen in hebt aangebracht en u wilt ze nu selectief toevoegen op basis van een patroon, kunt u de vlag --modifiedgebruiken

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

Als u bijvoorbeeld alleen de CSS-wijzigingen aan deze vastlegging wilt toevoegen, kunt u dat doen

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

Zie man git-ls-filesvoor meer vlaggen


Antwoord 7, autoriteit 4%

Gebruik gewoon git add *\*.java. Dit zal alle .java-bestanden in de hoofdmap en alle submappen toevoegen.


Antwoord 8, autoriteit 3%

Een Windows-opdrachtregeloplossing toevoegen die nog niet werd genoemd:

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

Antwoord 9, autoriteit 3%

Omdat het hier niet wordt vermeld, moet u ook rekening houden met de “magische handtekening:/om recursief alles toe te voegen dat overeenkomt onder de hoofdmap van het project:

git add :/*.{java,pom}

Tx naar: https://stackoverflow.com/a/64210713/2586761


Antwoord 10, autoriteit 2%

Ik wilde alleen bestanden toevoegen die een bepaalde string hadden op basis van git status:

git status | grep string | xargs git add

en was vervolgens in staat om git commit -m 'commit msgte gebruiken om alle gewijzigde bestanden te committen met “string” in de titel van het bestand


Antwoord 11

Zoals vermeld in “git: Hoe voeg ik recursief alle bestanden toe in een mapsubstructuur die overeenkomen met een glob-patroon?“, als je je pathspec-globbing op de juiste manier escapet of citeert (zoals '*.java'), dan ja, git add '*.java'

Git 2.13 (Q2 2017) verbetert dat voor interactieve toevoeging:

Zie commit 7288e12(14 maart 2017) door Jeff King (peff).
(Samengevoegd door Junio ​​C Hamano — gitsterin commit 153e0d7, 17 maart 2017)

add --interactive: breid pathspecs niet uit met ls-files

Als we de lijst met gewijzigde bestanden willen krijgen, breiden we eerst alle door de gebruiker verstrekte padspecificaties uit met “ls-files“, en voeren vervolgens de resulterende lijst met paden als argumenten aan “diff-index” en “diff-files“.
Als uw pathspec zich uitbreidt tot een groot aantal paden, kunt u een van de volgende twee problemen tegenkomen:

  1. Het besturingssysteem kan klagen over de grootte van het argument
    lijst, en weigeren te rennen. Bijvoorbeeld:

    $ (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.
    

Dat staat in de linux.git-repository, die ongeveer 20K bestanden heeft in de map “drivers” (geen van hen is in dit geval gewijzigd). De truc “ulimit -s” is nodig om het probleem op Linux te laten zien, zelfs voor zo’n gigantische reeks paden.
Andere besturingssystemen hebben veel kleinere limieten (er werd bijvoorbeeld een geval in de echte wereld gezien met slechts 5K-bestanden op OS X).

  1. Zelfs als het werkt, is het erg traag. De padspecificatie
    code is niet geoptimaliseerd voor grote aantallen paden. Hier is
    hetzelfde geval zonder de ulimit:

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

We kunnen dit verbeteren door “ls-files” volledig over te slaan en de originele pathspecs aan de diff-opdrachten toe te voegen.

Historisch gezien was de pathspec-taal die werd ondersteund door “diff-index” zwakker, maar dat is niet langer het geval.


Antwoord 12

zet regel in ~/.gitconfig

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

Als u alle gewijzigde java-bestanden wilt toevoegen, kunt u het volgende doen:
git addt java

Als u alle gewijzigde python-bestanden wilt toevoegen, kunt u het volgende doen:
git addt py


Antwoord 13

Een variatie die ik heb gebruikt in een GNUmakefile

.PHONY: docs
docs:
    @echo docs
    bash -c "if pgrep MacDown; then pkill MacDown; fi"
    bash -c 'cat $(PWD)/HEADER.md                >  $(PWD)/README.md'
    bash -c 'cat $(PWD)/COMMANDS.md              >> $(PWD)/README.md'
    bash -c 'cat $(PWD)/FOOTER.md                >> $(PWD)/README.md'
    bash -c 'pandoc -s README.md -o index.html'
    bash -c "if hash open 2>/dev/null; then open README.md; fi || echo failed to open README.md"
    #git add --ignore-errors *.md
    git ls-files -co --exclude-standard | grep '\.md/$\' | xargs git 

Other episodes