Hoe voeg ik recursief bestanden toe aan de hand van een patroon (of glob) in verschillende mappen?
Ik wil bijvoorbeeld A/B/C/foo.java
en 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]/\*.java
gebruiken om Java-bestanden uit submappen toe te voegen,
bijv. git add ./\*.java
voor huidige map.
Van git add
documentatie:
Voegt inhoud toe van alle
*.txt
bestanden onder deDocumentation
directory 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 deDocumentation/
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-files
combineren 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 zsh
kun je het volgende uitvoeren:
git add "**/*.java"
en al uw *.java
bestanden 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 --modified
gebruiken
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-files
voor 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 msg
te 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 — gitster
—in commit 153e0d7, 17 maart 2017)
add --interactive
: breid pathspecs niet uit metls-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:
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).
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