Jak rekurencyjnie dodawać pliki według wzorca (lub globu) znajdującego się w różnych katalogach?
Na przykład chciałbym dodać A/B/C/foo.java
i D/E/F/bar.java
(i kilka innych plików java) za pomocą jednego polecenia:
git add '*.java'
Niestety to nie działa zgodnie z oczekiwaniami.
git
glob
filepattern
Michel Krämer
źródło
źródło
.java
pliki w swoim bieżącym katalogu, być może masz do czynienia ze skomplikowaną obsługą symboli wieloznacznych między bash a „pomocnikiem” wiersza poleceń msys . Nie jestem pewien rozwiązania. Możesz wypróbować wiele warstw cudzysłowów:git add '"*.java"'
(pojedyncze cudzysłowy są pobierane przez bash, aby zapobiec rozszerzaniu globów, podwójne cudzysłowy są pobierane przez warstwę msys, aby zapobiec rozszerzaniu globów).git add *.java
działa dla mnie (na PowerShell z klientem GitHub)Odpowiedzi:
Odpowiedź Sergio Acosty jest prawdopodobnie najlepszym rozwiązaniem, jeśli niektóre z plików do dodania mogą nie być jeszcze śledzone. Jeśli chcesz ograniczyć się do plików, o których git już wie, możesz połączyć
git-ls-files
z filtrem:Git nie dostarcza żadnych wymyślnych mechanizmów, aby zrobić to sam, ponieważ jest to w zasadzie problem powłoki: jak uzyskać listę plików, które mają być dostarczone jako argumenty dla danego polecenia.
źródło
git ls-files -co --exclude-standard | grep '\.java$' | xargs git add
Możesz użyć,
git add [path]/\*.java
aby dodać pliki java z podkatalogów,np.
git add ./\*.java
Dla bieżącego katalogu.Z
git add
dokumentacji :źródło
Dzięki
zsh
niemu możesz biegać:a wszystkie twoje
*.java
pliki zostaną dodane rekurencyjnie.źródło
zsh
powłoka na okna ... zrobisz sobie przysługę, używając jej zamiast bash, imho.ls
).Trochę poza tematem (nie dotyczy konkretnie git), ale jeśli korzystasz z Linuksa / Uniksa, obejściem może być:
A jeśli spodziewasz się ścieżek ze spacjami:
Ale wiem, że to nie jest dokładnie to, o co prosiłeś.
źródło
Odpowiedź Siergieja (nie wierz mi) działa:
z niedawnym gitem:
Pliki do testu:
Stan Git:
Dodawanie * .txt:
Zaktualizowany stan:
źródło
Jeśli już śledzisz swoje pliki i dokonałeś w nich zmian, a teraz chcesz je dodać selektywnie na podstawie wzorca, możesz użyć
--modified
flagiNa przykład, jeśli chcesz tylko dodać zmiany CSS do tego zatwierdzenia, możesz to zrobić
Zobacz
man git-ls-files
więcej flagźródło
Po prostu użyj
git add *\*.java
. Spowoduje to dodanie wszystkich plików .java do katalogu głównego i wszystkich podkatalogów.źródło
Dodanie rozwiązania wiersza poleceń systemu Windows, o którym jeszcze nie wspomniano:
źródło
Chciałem tylko dodać pliki, które miały określony ciąg oparty na
git status
:git status | grep string | xargs git add
a następnie był w stanie
git commit -m 'commit msg
zatwierdzić wszystkie zmienione pliki ze słowem „string” w tytule plikuźródło
Jak wspomniano w " git: Jak rekurencyjnie dodać wszystkie pliki w poddrzewie katalogu, które pasują do wzorca glob? ", Jeśli poprawnie zmienisz ścieżkę lub zacytujesz swoją ścieżkę globbing (jak
'*.java'
), to tak, git dodaj'*.java'
Git 2.13 (Q2 2017) ulepsza to dla interaktywnego dodatku:
Zobacz commit 7288e12 (14 marca 2017) autorstwa Jeffa Kinga (
peff
) .(Scalone przez Junio C Hamano -
gitster
- w zobowiązaniu 153e0d7 , 17 marca 2017 r.)Historycznie, język pathspec obsługiwany przez „
diff-index
” był słabszy, ale już tak nie jest.źródło
umieść linię w ~ / .gitconfig
[alias] addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -
Jeśli chcesz dodać wszystkie zmodyfikowane pliki java, możesz po prostu zrobić:
git addt java
Samely, jeśli chcesz dodać cały zmodyfikowany plik Pythona, możesz po prostu zrobić:
git addt py
źródło