Jak wyświetlić wszystkie pliki w zatwierdzeniu?


2791

Szukam prostego gitpolecenia, które zapewnia ładnie sformatowaną listę wszystkich plików, które były częścią zatwierdzenia podanego przez skrót (SHA1), bez żadnych dodatkowych informacji.

Próbowałem:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Chociaż zawiera listę plików, zawiera również niepożądane informacje o różnicach dla każdego z nich.

Czy istnieje inne gitpolecenie, które dostarczy tylko potrzebną listę, aby uniknąć parsowania jej z git showwyniku?


43
Przybyłem tutaj, szukając czegoś innego. Chcę zobaczyć wszystkie pliki zmodyfikowane dla zestawu zatwierdzeń i zakończyć git log --until 2013-05-21 --pretty="short" --name-onlyz dobrym efektem.
Ograniczone Zadośćuczynienie

4
Użyj tego polecenia, aby uzyskać wszystkie zmiany z poprzednich nzatwierdzeń do master:git diff-tree --name-status -r @{3} master
ako

3
git diff --name-only master- Aby wyświetlić WSZYSTKIE zmienione pliki w bieżącej gałęzi, w porównaniu do gałęzi głównej.
Noam Manos,

Odpowiedzi:


3758

Preferowany sposób (ponieważ jest to polecenie hydrauliczne ; ma być programowe):

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js

Inna droga (mniej preferowana dla skryptów, ponieważ jest to polecenie porcelanowe ; przeznaczone do obsługi przez użytkownika)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js

  • W --no-commit-idtłumi popełnić wyjście ID.
  • --prettyArgument określa pusty ciąg formatu aby uniknąć cruft na początku.
  • Te --name-onlypokazy argumentów tylko nazwy plików, które zostały dotknięte (Dzięki Hank). Użyj --name-statuszamiast tego, jeśli chcesz zobaczyć, co się stało z każdego pliku ( D eleted, M odified, dded)
  • -rArgument jest rekursja do podstrumieni drzew

25
Należy zauważyć, że diff-treenie będzie działać, gdy spojrzymy na główny zatwierdzenie.
jbranchaud

327
Zastąpienie tej --name-onlyopcji --name-statusda bardziej przejrzyste podsumowanie.
Kurt Zhong,

20
Jeśli chcesz, aby działał na głównym zatwierdzeniu, użyj flagi --root. Ze strony podręcznika: „Gdy podano opcję --root, początkowe zatwierdzenie zostanie pokazane jako duże wydarzenie tworzenia. Jest to równoważne różnicy względem drzewa NULL.”
Chris

24
git log --name-only -n 1 <hash>Ostatnim zatwierdzeniem byłoby:git log --name-only -n 1 HEAD~1..HEAD
Kurt

10
Jeśli ktoś zastanawia się (tak jak ja), dlaczego pierwszy sposób jest „preferowany”, wraca do komentarza @drizzt; git showto „porcelana” (przeznaczona do obsługi przez użytkownika) i git diff-tree„hydraulika” (przeznaczona do użycia programowego, np. ze skryptów). Interfejs tego pierwszego może się zmieniać z czasem (więc opiekunowie gitów mogą upaść, --name-onlychociaż nie sądzę, że by to zrobili ) ze względów użyteczności, podczas gdy interfejs dla tych drugich będzie utrzymywany tak stabilny, jak to możliwe ze względu na kompatybilność.
killscreen

237

Jeśli chcesz uzyskać listę zmienionych plików:

git diff-tree --no-commit-id --name-only -r <commit-ish>

Jeśli chcesz uzyskać listę wszystkich plików w zatwierdzeniu, możesz użyć

git ls-tree --name-only -r <commit-ish>

1
Drzewo ls z opcją --name-only nie działa na 1.6.4.4 lub 1.6.3.3. Myślisz, że to błąd?
krosenvold

git ls-tree --name-only HEAD( wymagany jest parametr <commit-ish> ; w tym przykładzie jest to HEAD) działa dla mnie z wersją git 1.6.4.3
Jakub Narębski

2
Okazuje się, że kolejność parametrów jest tutaj znacząca. Jedyny w swoim poście nie działa, a jeden w swojej odpowiedzi nie praca - przynajmniej do czasu aktualizować swój post;)
krosenvold

5
Przejdź, --no-commit-idaby uniknąć drukowania SHA1, w ten sposób:git diff-tree --no-commit-id --name-only -r <commit-ish>
John Mellor

3
@CoDEmanX: Nie przegapiłeś dodania -r/ -topcji, prawda? Ponieważ drzewo różnic obsługuje zarówno zmodyfikowane, jak i dodane pliki. Jeśli chcesz wyświetlić listę wszystkich (dodanych) plików, użyjgit diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
Jakub Narębski,

226

Zakładam, że gitknie jest to pożądane. W takim przypadku spróbuj git show --name-only <sha>.


36
- sama nazwa jest wystarczająca w większości przypadków, gdy jej potrzebowałem; Dlatego głosowałem za najkrótszym rozwiązaniem (i jedynym, które pamiętam za 1 próbą).
Erik S

25
Lub --name-status.
Neil Traft

Jako ktoś, kto naprawdę lubi git CLI, gitkjest naprawdę dobrym sposobem na przejrzenie plików i wyświetlenie pliku, w którym znajduje się diff. np. Kod sprawdzający, czy potwór zatwierdził od partnera.
Elijah Lynn

192

Osobiście używam kombinacji --stat i --oneline z poleceniem show :

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD

Jeśli nie lubią / chcą statystyki dodawanie / usuwania, można zastąpić --stat z --name tylko

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD

4
To jest świetne! Zasadniczo daje podsumowanie pliku, które Github pokazuje u góry widoku zatwierdzenia. Dzięki.
trisweb

Bardzo dobrze. W celu zdefiniowania aliasu: alias gits='git show --stat --oneline', a następnie gitsprzez sam pokazuje najnowsze zmiany (w głowie), natomiast gits b24f5fbmogą być używane, aby pokazać zmiany jakiejkolwiek rewizji za.
Brent Faust,

5
Można również utworzyć alias git ... np git config --global alias.changes 'show --stat --oneline'. Być może . Następnie możesz wpisać git changes(z opcjonalnym zatwierdzeniem) i uzyskać wynik z pierwszych przykładów powyżej.
Lindes

Git dla Windows wymaga podwójnych cytatów:git config --global alias.changes "show --stat --oneline"
Alchemistmatt,

3
Miły. I w przeciwieństwie do akceptowanego odpowiedź, git showdziała również na przeglądanie stashed zmian: na przykładgit show --stat --oneline stash@{1}
Jeff Ward

83

Możesz też zrobić

git log --name-only

i możesz przeglądać różne zatwierdzenia, zatwierdzać wiadomości i zmienione pliki.

Wpisz q, aby odzyskać monit.


Dzięki, pomaga. BTW: użyj, git show 5944ad2a8b5 --name-onlyaby wyświetlić nazwę konkretnego zatwierdzenia
LiuWenbin_NO.

68

Ostatnio musiałem wymienić wszystkie zmienione pliki między dwoma zatwierdzeniami. Więc użyłem tej (także * nix) komendy

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

Aktualizacja : Lub, jak wskazał Ethan poniżej

git diff --name-only START_COMMIT..END_COMMIT

Używanie --name-statusobejmie również zmianę (dodaną, zmodyfikowaną, usuniętą itp.) Obok każdego pliku

git diff --name-status START_COMMIT..END_COMMIT

4
Jeśli używasz git diff --name-status START_COMMIT..END_COMMIT, nie potrzebujesz końcowego |sort | uniq.
Ethan

Korekta powyższego komentarza:git diff --name-only START_COMMIT..END_COMMIT
Ethan

Właśnie tego szukałem. Jak użyłem go: git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Chciałem listę zmian kodu tylko dla ogromnego PR, który dodał tysiące plików PNG i układów XML.
AutonomousApps

63

Najprostsza forma:

git show --stat (hash)

Łatwiej to zapamiętać i dostarczy Ci wszystkich potrzebnych informacji.

Jeśli naprawdę chcesz tylko nazwy plików, możesz dodać --name-onlyopcję.

git show --stat --name-only (hash)


2
- Tylko nazwa będzie nadal zawierać kilka nagłówków zawierających informacje, takie jak autor, data i komunikat zatwierdzenia.
pożarł elysium

znalazłem tylko jednego, który działa dla zatwierdzenia scalania
Alex Punnen

47

Dość często używam zmienionego aliasu. Aby skonfigurować:

git config --global alias.changed 'show --pretty="format:" --name-only'

następnie:

git changed (lists files modified in last commit)   
git changed bAda55 (lists files modified in this commit)
git changed bAda55..ff0021 (lists files modified between those commits)

Podobne polecenia, które mogą być przydatne:

git log --name-status --oneline (very similar, but shows what actually happened M/C/D)
git show --name-only

40

Posługiwać się

git log --name-status

Spowoduje to wyświetlenie identyfikatora zatwierdzenia, wiadomości, plików zmienionych oraz tego, czy zostało zmodyfikowane, utworzone, dodane lub usunięte. Coś w rodzaju polecenia „wszystko w jednym”.


38

Za pomocą standardowej komendy git diff (przydatnej również w skryptach):

git diff --name-only <sha>^ <sha>

Jeśli chcesz również status zmienionych plików:

git diff --name-status <sha>^ <sha>

Działa to dobrze z zatwierdzeniami scalania.


26

spróbuj tego polecenia dla nazwy i zmienia numer linii

git show --stat <commit-hash>

pokaż tylko nazwy plików

git show --stat --name-only  <commit-hash>

aby uzyskać ostatni hash zatwierdzenia, spróbuj wykonać to polecenie

git log -1

ostatnie zatwierdzenie z nazwą pliku i statusem pliku zmodyfikuj, utwórz lub usuń

 git log -1 --oneline --name-status <commit-hash>

lub dla wszystkich

git log

Więcej informacji na temat dziennika git znajdziesz w tym artykule

https://devhints.io/git-log-format

https://devhints.io/git-log


1
@DanFare „krytyczny: nierozpoznany argument: - tylko nazwy” z wersji 2.20.1.windows.1
2864740


20

OK, istnieje kilka sposobów pokazania wszystkich plików w konkretnym zatwierdzeniu ...

Aby zmniejszyć informacje i wyświetlać tylko nazwy plików, które zostały zatwierdzone, możesz po prostu dodać --name-onlylub --name-statusoflagować ..., te flagi pokazują tylko nazwy plików, które różnią się od poprzednich zatwierdzeń, jak chcesz ...

git diffNastępnie możesz zrobić, po --name-onlydwóch hashach zatwierdzenia <sha0> <sha1>, coś w stylu poniżej:

git diff --name-only 5f12f15 kag9f02 

Tworzę również poniższy obraz, aby pokazać wszystkie kroki, które należy wykonać w tej sytuacji:

git diff - tylko nazwa 5f12f15 kag9f02


Dlaczego dwie referencje (nazywacie je skrótami)?
hakre

15

Używam tego, aby uzyskać listę zmodyfikowanych plików między dwoma zestawami zmian:

git diff --name-status <SHA1> <SHA2> | cut -f2

Tak, ale status może być całkiem przydatny (na przykład możesz chcieć grep, aby wyświetlić wszystkie pliki oprócz tych, które zostały usunięte za pomocą czegoś takiegogit diff --name-status .. | grep ^[^D] | cut -f2
Pierre-Adrien Buisson


14

Jest też git whatchanged, który jest bardziej niski niżgit log

NAME
       git-whatchanged - Show logs with difference each commit introduces

Wyświetla podsumowanie zatwierdzenia wraz z listą plików pod nimi wraz z ich trybami i jeśli zostały dodane ( A), usunięte ( D) lub zmodyfikowane ( M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

Dałby coś takiego:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <xx@xx.nl>
Date:   Tue Sep 29 17:23:22 2015 +0200

    added fb skd and XLForm

:000000 100644 0000000... 90a20d7... A  Pods/Bolts/Bolts/Common/BFCancellationToken.h
:000000 100644 0000000... b5006d0... A  Pods/Bolts/Bolts/Common/BFCancellationToken.m
:000000 100644 0000000... 3e7b711... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h
:000000 100644 0000000... 9c8a7ae... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m
:000000 100644 0000000... bd6e7a1... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h
:000000 100644 0000000... 947f725... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m
:000000 100644 0000000... cf7dcdf... A  Pods/Bolts/Bolts/Common/BFDefines.h
:000000 100644 0000000... 02af9ba... A  Pods/Bolts/Bolts/Common/BFExecutor.h
:000000 100644 0000000... 292e27c... A  Pods/Bolts/Bolts/Common/BFExecutor.m
:000000 100644 0000000... 827071d... A  Pods/Bolts/Bolts/Common/BFTask.h
...

Wiem, że ta odpowiedź tak naprawdę nie pasuje „bez zbędnych informacji”, ale nadal uważam, że ta lista jest bardziej przydatna niż tylko nazwy plików.


Dodatkowo, tylko jedno polecenie whatchangedzamiast podawania parametrów.
Gabrielius

11

Lubię to:

git diff --name-status <SHA1> <SHA1>^

Myślę, że to pobiera statusy plików A& D(dodaj i usuń) wstecz, ponieważ pokazuje różnicę od określonego zatwierdzenia do poprzedniego zatwierdzenia, zamiast na odwrót. Powinno być git diff --name-status <SHA1>^ <SHA1>.
Troy Gizzi

11

Użyj prostego polecenia w jednym wierszu, jeśli chcesz tylko zmienić listę plików w ostatnim zatwierdzeniu:

git diff HEAD~1 --name-only

8

Lista plików, które zmieniły się w zatwierdzeniu:

git diff --name-only SHA1^ SHA1

Nie wyświetla to komunikatów dziennika, dodatkowych znaków nowej linii ani żadnego innego bałaganu. Działa to dla każdego zatwierdzenia, nie tylko bieżącego. Nie wiem, dlaczego to nie całkiem jeszcze wymienione, więc dodaję go.


Te dwa wyglądają tak samo: git diff SHA1^ SHA1i git show SHA1.
Vladimir Vukanac

1
@mrW Polecenia te generują podobne dane wyjściowe, ale git showtakże wyświetlają komunikat zatwierdzenia
Newtonx

8

Wyświetl dziennik.

COMMIT może być puste („”) lub sha-1 lub sha-1 skrócone.

git log COMMIT -1 --name-only

Spowoduje to wyświetlenie tylko plików, bardzo przydatnych do dalszego przetwarzania.

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"

8

Znaleziono idealną odpowiedź na to:

git show --name-status --oneline <commit-hash>

Abym mógł wiedzieć

which files were just modified M

Which files were newly added , A

Which files were deleted , D

5

Kombinacja „ git show --stat” (dzięki Ryan) i kilku poleceń sed powinna skrócić dane dla Ciebie:

git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"

To utworzy tylko listę zmodyfikowanych plików.


5

Istnieje prosta sztuczka, którą można wyświetlić jako listę plików, wystarczy dodać :po skrócie.

git show 9d3a52c474:

Następnie możesz wiercić,

git show 9d3a52c474:someDir/someOtherDir

Jeśli trafisz plik, otrzymasz jego surową wersję; co czasami jest tym, czego chcesz, jeśli szukasz tylko dobrego odnośnika lub kluczowych fragmentów kodu (różnice mogą sprawić, że wszystko będzie bałaganem),

git show 9d3a52c474:someDir/someOtherDir/somefile

Jedyną wadą tej metody jest to, że nie wyświetla ona łatwo drzewa plików.



2

Używam tego, aby uzyskać listę zmienionych plików podczas zatwierdzania scalania

λ git log -m -1 --name-only --pretty="format:"
configs/anotherconfig.xml
configs/configsInRepo.xml

lub

λ git log -m -1 --name-status --pretty="format:"
A       configs/anotherconfig.xml
M       configs/configsInRepo.xml

2

Jeśli używasz wtyczki oh-my-zsh i git, skrót glg jest pomocny.


3
Czy po prostu ... wyciąłeś cały kod z odpowiedzi? To wcale nie to, co Ja skieruję do. Brak dodatkowych informacji w wynikach, o które poprosił OP, a nie w twojej odpowiedzi! Nadal masz odpowiedź, która generuje wiele obcych informacji. Ale teraz zostało to opisane mniej dokładnie. OP chciał wysyłać listę plików i nic więcej. Zobacz, jakie glgwyniki: o wiele więcej. Przepraszam za zamieszanie.
RomainValeri

0

Tylko lista plików (nawet komunikat zatwierdzenia):

git show --name-only --pretty=format:

Np. Otwórz wszystkie zmienione pliki w edytorze:

"$EDITOR" $(git show --name-only --pretty=format:)

-2

Pomyślałem, że podzielę się podsumowaniem mojego aliasu .. również uważam, że używanie 'zsh' świetnie z git it chroma keys wszystko ładnie i mówi, że chcesz, aby gałąź była przez cały czas, zmieniając wiersz polecenia.

Dla osób korzystających z SVN okaże się to przydatne: (jest to kombinacja pomysłów z różnych wątków, biorę tylko wiedzę o tym, jak używać kopiowania / wklejania)

.gitconfig:
        ls = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative --name-status

>>git ls
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker| 
| A     icds.xcodeproj/project.pbxproj
| A     icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata
| A     icds/AppDelegate.m
| A     icds/Assets.xcassets/AppIcon.appiconset/Contents.json

* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker| 
| D     Classes/AppInfoViewControler.h
| D     Classes/AppInfoViewControler.m
| D     Classes/CurveInstrument.h


.gitconfig: 
       lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>>git lt
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker
* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker
* 778bda6 - Cleanup for new project (11 hours ago) Jim Zucker
* 7373b5e - clean up files from old version (11 hours ago) Jim Zucker
* 14a8d53 - (tag: 1.x, origin/swift, origin/master, master) Initial Commit (16 hours ago) Jim Zucker


.gitconfig
lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>> git lt

commit 99f21a61de832bad7b2bdb74066a08cac3d0bf3c
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:23:10 2015 -0800

    New Files from xcode 7

A       icds.xcodeproj/project.pbxproj
A       icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata


commit e0a1bb6b59ed6a4f9147e894d7f7fe00283fce8d
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:17:00 2015 -0800

    Move everything to old

D       Classes/AppInfoViewControler.h
D       Classes/AppInfoViewControler.m
D       Classes/CurveInstrument.h
D       Classes/CurveInstrument.m

-3

To powinno działać:

git status

To pokaże, co nie jest zainscenizowane i co jest zainscenizowane.


7
Pytanie dotyczy uzyskania listy plików w uprzednio zatwierdzonym zatwierdzeniu, a nie w zatwierdzonym programie.
Rup
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.