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?

Philip Fourie
źródło
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
Ryan McGeary
źródło
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>
Jakub Narębski
źródło
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>.

Hank Gay
źródło
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
Tuxdude
źródło
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.

Indu Devanath
źródło
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
Łunohodow
źródło
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)

VaTo
źródło
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
zabiera
źródło
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”.

alpha_989
źródło
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.

vquintans
źródło
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

Jignesh Joisar
źródło
1
@DanFare „krytyczny: nierozpoznany argument: - tylko nazwy” z wersji 2.20.1.windows.1
2864740
24
$ git log 88ee8 ^ .. 88ee8 - tylko nazwa --pretty = "format:"
Pat Notz
źródło
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

Alireza
źródło
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
użytkownik135507
źródło
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

Lubię korzystać

git show --stat <SHA1>^..<SHA2>
Michael De Silva
źródło
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 <[email protected]>
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.

Koen
źródło
Dodatkowo, tylko jedno polecenie whatchangedzamiast podawania parametrów.
Gabrielius
11

Lubię to:

git diff --name-status <SHA1> <SHA1>^
skiphoppy
źródło
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
Developer-Sid
źródło
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.

Newtonx
źródło
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]"
thefreshteapot
źródło
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
Ijaz Ahmad Khan
źródło
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.

seanhodges
źródło
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.

srcspider
źródło
3
git show HEAD@{0}

działa dobrze dla mnie

Bruce
źródło
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
Piotr Perak
źródło
2

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

Henz
źródło
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:)
użytkownik2394284
źródło
-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 <[email protected]>
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 <[email protected]>
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
Jim Zucker
źródło
-3

To powinno działać:

git status

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

4067098
źródło
7
Pytanie dotyczy uzyskania listy plików w uprzednio zatwierdzonym zatwierdzeniu, a nie w zatwierdzonym programie.
Rup