Bagaimana cara membuat daftar semua file dalam komit?

2794

Saya mencari gitperintah sederhana yang menyediakan daftar semua file yang diformat dengan baik yang merupakan bagian dari komit yang diberikan oleh hash (SHA1), tanpa informasi tambahan.

Saya telah mencoba:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Meskipun daftar file, itu juga mencakup informasi diff yang tidak diinginkan untuk masing-masing.

Apakah ada gitperintah lain yang hanya akan memberikan daftar yang saya inginkan, sehingga saya dapat menghindari parsing dari git showoutput?

Philip Fourie
sumber
43
Saya datang ke sini mencari sesuatu yang sedikit berbeda. Saya ingin melihat semua file dimodifikasi untuk satu set komit dan akhirnya menggunakan git log --until 2013-05-21 --pretty="short" --name-onlydengan efek yang baik.
Penebusan Terbatas
4
Gunakan perintah ini untuk mendapatkan semua perubahan dari nkomit sebelumnya hingga master:git diff-tree --name-status -r @{3} master
ako
3
git diff --name-only master- Untuk membuat daftar SEMUA file yang diubah pada cabang saat ini, dibandingkan dengan cabang utama.
Noam Manos

Jawaban:

3764

Cara yang Dipilih (karena ini adalah perintah pipa ledeng ; dimaksudkan untuk diprogram):

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

Cara Lain (kurang disukai untuk skrip, karena ini adalah perintah porselen ; dimaksudkan untuk menghadap pengguna)

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

  • The --no-commit-idmenekan komit ID output.
  • The --prettyargumen menentukan sebuah format string kosong untuk menghindari cruft di awal.
  • The --name-onlyargumen hanya menunjukkan nama file yang dipengaruhi (Thanks Hank). Gunakan --name-statussebaliknya, jika Anda ingin melihat apa yang terjadi pada masing-masing file ( D dihapus, M odified, A dded)
  • The -rargumen adalah untuk recurse ke dalam sub-pohon
Ryan McGeary
sumber
25
Perlu dicatat bahwa diff-treetidak akan berfungsi ketika melihat root commit.
jbranchaud
327
Mengganti --name-onlyopsi dengan --name-statusakan memberikan ringkasan yang lebih jelas.
Kurt Zhong
20
Jika Anda ingin itu berfungsi pada komit root, gunakan flag --root. Dari halaman manual: "Ketika --root ditentukan, komit awal akan ditampilkan sebagai acara kreasi besar. Ini sama dengan diff terhadap pohon NULL."
Chris
24
git log --name-only -n 1 <hash>Komit terakhir adalah:git log --name-only -n 1 HEAD~1..HEAD
Kurt
10
Jika ada yang bertanya-tanya (seperti saya) mengapa cara pertama "disukai," itu kembali ke komentar @drizzt; git showadalah "porselen" (dimaksudkan untuk menghadap pengguna) dan git diff-tree"pipa ledeng" (dimaksudkan untuk digunakan secara terprogram, misalnya dari skrip). Antarmuka untuk yang pertama dapat berubah dari waktu ke waktu (sehingga pengelola git bisa turun --name-onlymeskipun saya tidak membayangkan mereka akan melakukannya ) untuk alasan penggunaan, sedangkan antarmuka untuk yang terakhir akan dijaga setestabil mungkin untuk alasan kompatibilitas.
killscreen
237

Jika Anda ingin mendapatkan daftar file yang diubah:

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

Jika Anda ingin mendapatkan daftar semua file dalam komit, Anda dapat menggunakan

git ls-tree --name-only -r <commit-ish>
Jakub Narębski
sumber
1
Pohon-ls dengan hanya -nama-tampaknya tidak berfungsi pada 1.6.4.4 atau 1.6.3.3. Apakah Anda pikir ini adalah bug?
krosenvold
git ls-tree --name-only HEAD(Parameter <commit-ish> diperlukan ; dalam contoh ini adalah HEAD) berfungsi untuk saya dengan git versi 1.6.4.3
Jakub Narębski
2
Ternyata urutan parameternya signifikan di sini. Yang di posting Anda tidak berfungsi, sedangkan yang di respons Anda tidak berfungsi - setidaknya sampai Anda memperbarui posting Anda;)
krosenvold
5
Lulus --no-commit-iduntuk menghindari pencetakan SHA1, seperti:git diff-tree --no-commit-id --name-only -r <commit-ish>
John Mellor
3
@CoDEmanX: Anda tidak ketinggalan menambahkan -r/ -topsi, bukan? Karena diff-tree menangani file yang dimodifikasi dan ditambahkan. Jika Anda ingin membuat daftar semua file baru (ditambahkan), gunakangit diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
Jakub Narębski
226

Saya hanya akan berasumsi bahwa gitktidak diinginkan untuk ini. Kalau begitu, coba git show --name-only <sha>.

Hank Gay
sumber
36
--nama-saja banyak dalam banyak kasus di mana saya membutuhkannya; Oleh karena itu, upvoted solusi terpendek (dan satu-satunya yang saya ingat dalam 1 coba).
Erik S
25
Atau --name-status.
Neil Traft
Sebagai seseorang yang sangat menyukai CLI git, gitksebenarnya merupakan cara yang layak untuk meninjau file dan menampilkan file yang digunakan oleh diff. mis. Kode meninjau monster yang dikomit dari rekan.
Elijah Lynn
192

Saya pribadi menggunakan kombinasi --stat dan --oneline dengan perintah show :

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

Jika Anda tidak suka / ingin statistik penambahan / penghapusan, Anda dapat mengganti --stat dengan --name-only

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD
Tuxdude
sumber
4
Ini bagus! Ini pada dasarnya memberi Anda ringkasan file yang Github tunjukkan di bagian atas tampilan komit. Terima kasih.
trisweb
Sangat bagus. Untuk mendefinisikan alias:, alias gits='git show --stat --oneline'maka gitsdengan sendirinya menunjukkan perubahan terbaru (dalam HEAD), sementara gits b24f5fbdapat digunakan untuk menampilkan perubahan revisi.
Brent Faust
5
Orang juga bisa membuat alias git ... misalnya mungkin git config --global alias.changes 'show --stat --oneline'. Kemudian Anda dapat mengetik git changes(dengan komit opsional) dan mendapatkan output dari contoh pertama di atas.
lindes
Git untuk Windows memerlukan tanda kutip ganda:git config --global alias.changes "show --stat --oneline"
Alchemistmatt
3
Bagus. Dan tidak seperti jawaban yang diterima, git showjuga berfungsi untuk meninjau perubahan yang disimpan: mis.git show --stat --oneline stash@{1}
Jeff Ward
83

Anda juga bisa melakukannya

git log --name-only

dan Anda dapat menelusuri berbagai komit, melakukan pesan, dan file yang diubah.

Ketik q untuk mendapatkan kembali prompt Anda.

Indu Devanath
sumber
Terima kasih, ini membantu. BTW: gunakan git show 5944ad2a8b5 --name-onlyuntuk mendaftar nama komit tertentu
LiuWenbin_NO.
68

Baru-baru ini saya perlu membuat daftar semua file yang diubah antara dua komit. Jadi saya menggunakan perintah ini (juga * spesifik nix)

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

Pembaruan : Atau seperti yang ditunjukkan Ethan di bawah ini

git diff --name-only START_COMMIT..END_COMMIT

Menggunakan --name-statusjuga akan menyertakan perubahan (ditambahkan, diubah, dihapus dll) di sebelah setiap file

git diff --name-status START_COMMIT..END_COMMIT
lunohodov
sumber
4
Jika Anda menggunakan git diff --name-status START_COMMIT..END_COMMITmaka Anda tidak perlu trailing |sort | uniq.
Ethan
Koreksi komentar di atas:git diff --name-only START_COMMIT..END_COMMIT
Ethan
Ini yang saya cari. Bagaimana saya menggunakannya: git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Saya ingin daftar perubahan kode hanya untuk PR besar yang telah menambahkan ribuan tata letak PNG dan XML.
AutonomousApps
63

Bentuk paling sederhana:

git show --stat (hash)

Itu lebih mudah diingat dan itu akan memberi Anda semua informasi yang Anda butuhkan.

Jika Anda benar-benar hanya menginginkan nama file, Anda dapat menambahkan --name-onlyopsi.

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

VaTo
sumber
2
--name-only akan tetap menyertakan beberapa baris header yang berisi informasi seperti penulis, tanggal dan pesan komit.
melahap elysium
hanya satu yang saya temukan yang berfungsi untuk komit gabungan
Alex Punnen
47

Saya menggunakan alias yang diubah cukup sering. Untuk mengaturnya:

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

kemudian:

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)

Perintah serupa yang mungkin berguna:

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

Menggunakan

git log --name-status

Ini akan menunjukkan kepada Anda komit, pesan, file berubah dan apakah itu diubah, dibuat, ditambahkan atau dihapus. Agak dari perintah all-in-one.

alpha_989
sumber
38

Menggunakan perintah git diff standar (juga bagus untuk skrip):

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

Jika Anda ingin juga status file yang diubah:

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

Ini bekerja dengan baik dengan menggabungkan komitmen.

vquintans
sumber
26

coba perintah ini untuk nama dan ubah nomor baris

git show --stat <commit-hash>

hanya menampilkan nama file

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

untuk mendapatkan hash komit terakhir, lalu coba perintah ini

git log -1

komit terakhir dengan menunjukkan nama file dan mengubah status file, membuat atau menghapus

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

atau untuk semua

git log

untuk informasi log git lebih lanjut baca artikel ini

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

https://devhints.io/git-log

Jignesh Joisar
sumber
1
@DanFare "fatal: argumen tidak dikenal: - hanya nama" dari 2.20.1.windows.1
user2864740
24
$ git log 88ee8 ^ .. 88ee8 --name-only --pretty = "format:"
Pat Notz
sumber
20

BAIK, ada beberapa cara untuk menampilkan semua file dalam komit tertentu ...

Untuk mengurangi info dan hanya menampilkan nama file yang dikomit, Anda bisa menambahkan--name-only atau --name-statusmenandai ..., flag-flag ini hanya menunjukkan kepada Anda nama-nama file yang berbeda dari komit sebelumnya seperti yang Anda inginkan ...

Jadi Anda dapat melakukan git diffdiikuti oleh --name-only, dengan dua hash setelah <sha0> <sha1>, sesuatu seperti di bawah ini:

git diff --name-only 5f12f15 kag9f02 

Saya juga membuat gambar di bawah ini untuk menunjukkan semua langkah yang harus dilalui dalam situasi ini:

git diff --name-only 5f12f15 kag9f02

Alireza
sumber
Mengapa dua referensi (sebut saja hash)?
hakre
15

Saya menggunakan ini untuk mendapatkan daftar file yang dimodifikasi antara dua perubahan:

git diff --name-status <SHA1> <SHA2> | cut -f2
pengguna135507
sumber
Ya tapi statusnya bisa sangat berguna juga (untuk isntance, Anda mungkin ingin melihat semua file kecuali yang telah dihapus dengan sesuatu sepertigit diff --name-status .. | grep ^[^D] | cut -f2
Pierre-Adrien Buisson
14

Saya suka menggunakan

git show --stat <SHA1>^..<SHA2>
Michael De Silva
sumber
14

Ada juga git whatchanged, yang lebih rendah daripada tingkatgit log

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

Ini menghasilkan ringkasan komit dengan daftar file di bawahnya dengan modenya dan jika ada ditambahkan ( A), dihapus ( D) atau diubah ( M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

Akan memberikan sesuatu seperti:

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

Saya tahu jawaban ini tidak benar-benar cocok "tanpa informasi yang asing.", Tapi saya masih berpikir daftar ini lebih berguna daripada hanya nama file.

Koen.
sumber
Plus, hanya satu perintah whatchangeddaripada memasok parameter.
Gabrielius
11

Saya suka ini:

git diff --name-status <SHA1> <SHA1>^
skiphoppy
sumber
Saya pikir ini membuat status file A& D(tambah dan hapus) mundur, karena ini menunjukkan perbedaan dari komit yang ditentukan ke komit sebelumnya, alih-alih sebaliknya. Seharusnya begitu git diff --name-status <SHA1>^ <SHA1>.
Troy Gizzi
11

Gunakan perintah satu baris sederhana, jika Anda hanya ingin daftar file diubah di komit terakhir:

git diff HEAD~1 --name-only
Pengembang-Sid
sumber
8

Daftar file yang diubah dalam komit:

git diff --name-only SHA1^ SHA1

Ini tidak menampilkan pesan log, baris baru tambahan, atau kekacauan lainnya. Ini berfungsi untuk semua komit, bukan hanya komit saat ini. Tidak yakin mengapa itu tidak cukup disebutkan belum, jadi saya menambahkan itu.

Newtonx
sumber
Keduanya terlihat sama: git diff SHA1^ SHA1dan git show SHA1.
Vladimir Vukanac
1
@ mrW Perintah-perintah itu menghasilkan keluaran yang serupa, tetapi git showjuga memperlihatkan pesan komit
Newtonx
8

Tampilkan log.

COMMIT bisa kosong ("") atau sha-1 atau sha-1 disingkat.

git log COMMIT -1 --name-only

Ini hanya akan berisi daftar file, sangat berguna untuk diproses lebih lanjut.

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

Menemukan jawaban yang sempurna untuk ini:

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

Sehingga saya bisa tahu

which files were just modified M

Which files were newly added , A

Which files were deleted , D
Ijaz Ahmad Khan
sumber
5

Kombinasi " git show --stat" (terima kasih Ryan) dan beberapa perintah sed harus memangkas data untuk Anda:

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

Itu hanya akan menghasilkan daftar file yang dimodifikasi.

seanhodges
sumber
5

Ada trik sederhana untuk dilihat sebagai daftar file, cukup tambahkan :setelah hash.

git show 9d3a52c474:

Anda kemudian dapat menelusuri,

git show 9d3a52c474:someDir/someOtherDir

Jika Anda menekan file, Anda akan mendapatkan versi file mentah; yang kadang-kadang adalah apa yang Anda inginkan jika Anda hanya mencari referensi yang bagus atau bagian-bagian penting dari kode (diffs dapat membuat semuanya berantakan),

git show 9d3a52c474:someDir/someOtherDir/somefile

Satu-satunya kelemahan dari metode ini adalah tidak mudah menampilkan bagan file.

srcspider
sumber
3
git show HEAD@{0}

bekerja dengan baik untuk saya

Bruce
sumber
2

Saya menggunakan ini untuk mendapatkan daftar file yang diubah dalam menggabungkan komit

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

atau

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

Jika Anda menggunakan plugin oh-my-zsh dan git, pintasan glg sangat membantu.

Henry
sumber
3
Apakah Anda baru saja ... memotong semua kode dari jawaban Anda? Ini sama sekali bukan yang saya maksud. Tidak ada informasi asing dalam hasil keluaran seperti yang diminta oleh OP, tidak dalam jawaban Anda! Anda masih memiliki jawaban yang mengeluarkan BANYAK informasi yang tidak tersedia. Tapi sekarang, itu hanya dijelaskan jauh lebih akurat. OP ingin mengeluarkan daftar file, dan tidak lebih. Lihat glgoutput apa : lebih banyak. Maaf bila membingungkan.
RomainValeri
0

Hanya daftar file (bahkan tidak melakukan pesan):

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

Misalnya, buka semua file yang diubah di editor Anda:

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

Saya pikir saya akan berbagi ringkasan alias saya .. juga saya menemukan menggunakan 'zsh' hebat dengan git itu chroma kunci semuanya dengan baik dan memberitahu Anda ingin cabang ada di sepanjang waktu dengan mengubah command prompt.

Bagi mereka yang meliput dari SVN Anda akan menemukan ini berguna: (ini adalah kombinasi dari ide-ide dari utas yang berbeda, saya hanya mengambil kredit mengetahui cara menggunakan copy / paste)

.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
sumber
-3

Ini seharusnya bekerja:

git status

Ini akan menunjukkan apa yang tidak dipentaskan dan apa yang dipentaskan.

4067098
sumber
7
Pertanyaannya adalah tentang mendapatkan daftar file dalam komitmen yang sebelumnya dilakukan, bukan komitmen yang akan dilakukan.
Rup