Làm thế nào để liệt kê tất cả các tập tin trong một cam kết?


2794

Tôi đang tìm kiếm một gitlệnh đơn giản cung cấp một danh sách được định dạng độc đáo của tất cả các tệp là một phần của cam kết được đưa ra bởi hàm băm (SHA1), không có thông tin bên ngoài.

Tôi đã thử:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Mặc dù nó liệt kê các tệp, nó cũng bao gồm thông tin khác nhau không mong muốn cho mỗi tệp.

Có một gitlệnh khác sẽ chỉ cung cấp danh sách tôi muốn, để tôi có thể tránh phân tích cú pháp từ git showđầu ra?


43
Tôi đến đây để tìm kiếm một chút gì đó khác biệt. Tôi muốn xem tất cả các tệp được sửa đổi cho một tập hợp các cam kết và sử dụng git log --until 2013-05-21 --pretty="short" --name-onlyvới hiệu quả tốt.
Chuộc tội giới hạn

4
Sử dụng lệnh này để nhận tất cả các thay đổi từ các ncam kết trước đó cho đến master:git diff-tree --name-status -r @{3} master
ako

3
git diff --name-only master- Để liệt kê TẤT CẢ các tệp đã thay đổi trên nhánh hiện tại, so sánh với nhánh chính.
Noam Manos

Câu trả lời:


3763

Cách ưa thích (vì đó là lệnh hệ thống ống nước ; có nghĩa là lập trình):

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

Một cách khác (ít được ưu tiên hơn cho các tập lệnh, bởi vì đó là lệnh sứ ; có nghĩa là phải đối mặt với người dùng)

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

  • Việc --no-commit-idngăn chặn đầu ra ID cam kết.
  • Đối --prettysố chỉ định một chuỗi định dạng trống để tránh hành động ở đầu.
  • Đối --name-onlysố chỉ hiển thị tên tệp bị ảnh hưởng (Cảm ơn Hank). --name-statusThay vào đó, hãy sử dụng , nếu bạn muốn xem những gì đã xảy ra với mỗi tệp ( D đã xóa, M bị loại bỏ, A bị nhúng )
  • Đối -rsố là tái diễn thành các cây con

25
Cần lưu ý rằng diff-treesẽ không hoạt động khi nhìn vào cam kết gốc.
jbranchaud

327
Thay thế --name-onlytùy chọn với --name-statussẽ cho tóm tắt rõ ràng hơn.
Kurt Zhong

20
Nếu bạn muốn nó hoạt động trên root root, hãy sử dụng cờ --root. Từ trang man: "Khi --root được chỉ định, cam kết ban đầu sẽ được hiển thị dưới dạng một sự kiện sáng tạo lớn. Điều này tương đương với một khác biệt so với cây NULL."
Chris

24
git log --name-only -n 1 <hash>Cam kết cuối cùng sẽ là:git log --name-only -n 1 HEAD~1..HEAD
Kurt

10
Nếu bất cứ ai đang tự hỏi (như tôi) tại sao cách đầu tiên là "ưa thích", thì nó lại quay trở lại bình luận của @drizzt; git showlà "sứ" (có nghĩa là người dùng phải đối mặt) và git diff-treelà "hệ thống ống nước" (có nghĩa là được sử dụng theo chương trình, ví dụ từ các tập lệnh). Giao diện cho cựu có thể thay đổi theo thời gian (vì vậy các nhà bảo trì git thể thả --name-onlymặc dù tôi không tưởng tượng được họ sẽ ) vì những lý do useability, trong khi giao diện cho sau này sẽ được giữ ổn định như càng tốt vì các lý do tương thích.
killscreen

237

Nếu bạn muốn lấy danh sách các tập tin thay đổi:

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

Nếu bạn muốn nhận danh sách tất cả các tệp trong một cam kết, bạn có thể sử dụng

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

1
Cây ls với chỉ --name dường như không hoạt động trên 1.6.4.4 hoặc 1.6.3.3. Bạn có nghĩ rằng đây là một lỗi?
krosenvold

git ls-tree --name-only HEAD(tham số <commit-ish> là bắt buộc ; trong ví dụ này là CHÍNH) hoạt động với tôi với phiên bản git 1.6.4.3
Jakub Narębski

2
Nó chỉ ra thứ tự của các tham số có ý nghĩa ở đây. Bài viết trong bài đăng của bạn không hoạt động, trong khi bài trong phản hồi của bạn không hoạt động - ít nhất là cho đến khi bạn cập nhật bài đăng của mình;)
krosenvold

5
Vượt qua --no-commit-idđể tránh in SHA1, như vậy:git diff-tree --no-commit-id --name-only -r <commit-ish>
John Mellor

3
@CoDEmanX: Bạn đã không bỏ lỡ thêm -r/ -ttùy chọn, phải không? Bởi vì diff-tree xử lý cả các tệp được sửa đổi và thêm vào. Nếu bạn muốn liệt kê tất cả các tệp mới (đã thêm), hãy sử dụnggit diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
Jakub Narębski

226

Tôi sẽ chỉ cho rằng điều đó gitklà không mong muốn cho việc này. Trong trường hợp đó, hãy thử git show --name-only <sha>.


36
- chỉ tên là rất nhiều trong hầu hết các trường hợp tôi cần nó; Do đó, nâng cấp giải pháp ngắn nhất (và là giải pháp duy nhất tôi nhớ trong 1 lần thử).
Erik S

25
Hoặc --name-status.
Neil Traft 18/03/2015

Là một người thực sự thích CLI git, gitkthực sự là một cách tốt để xem xét các tệp và hiển thị tệp mà diff đang bật. ví dụ Mã xem xét một cam kết quái vật từ một đồng nghiệp.
Elijah Lynn

192

Cá nhân tôi sử dụng kết hợp giữa --stat--oneline với lệnh show :

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

Nếu bạn không thích / muốn số liệu thống kê thêm / xóa, bạn có thể thay thế --stat bằng --name-only

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

4
Điều đó thật tuyệt! Về cơ bản, nó cung cấp cho bạn bản tóm tắt tệp mà Github hiển thị ở đầu chế độ xem cam kết. Cảm ơn.
trisweb

Rất đẹp. Để xác định bí danh:, alias gits='git show --stat --oneline'sau đó, gitschính nó hiển thị các thay đổi mới nhất (trong CHÍNH), trong khi gits b24f5fbcó thể được sử dụng để hiển thị bất kỳ thay đổi nào của sửa đổi.
Brent Faust

5
Người ta cũng có thể tạo ra một bí danh git ... ví dụ có lẽ git config --global alias.changes 'show --stat --oneline'. Sau đó, bạn có thể nhập git changes(với một cam kết tùy chọn) và nhận đầu ra từ các ví dụ đầu tiên ở trên.
lindes

Git cho Windows yêu cầu báo giá kép:git config --global alias.changes "show --stat --oneline"
Nhà giả kim

3
Đẹp. Và không giống như câu trả lời được chấp nhận, git showcũng làm việc cho xem xét thay đổi cất giấu: ví dụgit show --stat --oneline stash@{1}
Jeff Phường

83

Bạn cũng có thể làm

git log --name-only

và bạn có thể duyệt qua các cam kết khác nhau, thông báo cam kết và các tệp đã thay đổi.

Nhập q để nhận lại lời nhắc của bạn.


Cảm ơn, nó giúp. BTW: sử dụng git show 5944ad2a8b5 --name-onlyđể liệt kê tên của một cam kết cụ thể
LiuWenbin_NO.

68

Gần đây tôi cần liệt kê tất cả các tệp đã thay đổi giữa hai lần xác nhận. Vì vậy, tôi đã sử dụng lệnh này (cũng là * nix cụ thể)

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

Cập nhật : Hoặc như Ethan chỉ ra bên dưới

git diff --name-only START_COMMIT..END_COMMIT

Việc sử dụng --name-statuscũng sẽ bao gồm thay đổi (thêm, sửa đổi, xóa, v.v.) bên cạnh mỗi tệp

git diff --name-status START_COMMIT..END_COMMIT

4
Nếu bạn sử dụng git diff --name-status START_COMMIT..END_COMMITthì bạn không cần theo dõi |sort | uniq.
Ethan

Sửa lỗi nhận xét trên:git diff --name-only START_COMMIT..END_COMMIT
Ethan

Đây là những gì tôi đang tìm kiếm. Làm thế nào tôi sử dụng nó : git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Tôi muốn một danh sách các thay đổi mã chỉ cho một PR lớn đã thêm hàng ngàn bố cục PNG và XML.
Ứng dụng tự động

63

Hình thức đơn giản nhất:

git show --stat (hash)

Điều đó dễ nhớ hơn và nó sẽ cung cấp cho bạn tất cả thông tin bạn cần.

Nếu bạn thực sự chỉ muốn tên của các tập tin, bạn có thể thêm --name-onlytùy chọn.

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


2
--name-only vẫn sẽ bao gồm một vài dòng tiêu đề chứa thông tin như tác giả, ngày tháng và thông báo cam kết.
nuốt chửng elysium

chỉ có một tôi tìm thấy hoạt động cho cam kết hợp nhất
Alex Punnen

47

Tôi sử dụng bí danh thay đổi khá thường xuyên. Để thiết lập nó:

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

sau đó:

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)

Các lệnh tương tự có thể hữu ích:

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

40

Sử dụng

git log --name-status

Điều này sẽ cho bạn thấy id cam kết, tin nhắn, các tệp đã thay đổi và liệu nó đã được sửa đổi, tạo, thêm hoặc xóa. Một phần của lệnh tất cả trong một.


38

Sử dụng lệnh git diff tiêu chuẩn (cũng tốt cho kịch bản):

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

Nếu bạn cũng muốn trạng thái của các tập tin thay đổi:

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

Điều này hoạt động tốt với các cam kết hợp nhất.


26

thử lệnh này cho tên và thay đổi số dòng

git show --stat <commit-hash>

chỉ hiển thị tên tập tin

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

để có được băm xác nhận cuối cùng, sau đó thử lệnh này

git log -1

cam kết cuối cùng với tên tệp hiển thị và trạng thái tệp sửa đổi, tạo hoặc xóa

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

hoặc cho tất cả

git log

để biết thêm thông tin nhật ký git đọc bài viết này

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

https://devhints.io/git-log


1
@DanFare "gây tử vong: đối số không được nhận dạng: - chỉ tên" từ 2.20.1.windows.1
user2864740

24
$ git log 88ee8 ^ .. 88ee8 - chỉ tên --pretty = "định dạng:"

20

ĐỒNG Ý, có một số cách để hiển thị tất cả các tệp trong một cam kết cụ thể ...

Để giảm thông tin và chỉ hiển thị tên của các tệp đã cam kết, bạn chỉ cần thêm --name-onlyhoặc--name-status gắn cờ ..., những cờ này chỉ hiển thị cho bạn tên tệp khác với các cam kết trước đó như bạn muốn ...

Vì vậy, bạn có thể làm git difftheo sau --name-only, với hai lần băm cam kết sau <sha0> <sha1>, đại loại như sau:

git diff --name-only 5f12f15 kag9f02 

Tôi cũng tạo hình ảnh dưới đây để hiển thị tất cả các bước cần thực hiện trong các tình huống này:

git diff - tên chỉ 5f12f15 kag9f02


Tại sao hai ref (bạn đặt tên cho chúng là băm)?
hakre

15

Tôi sử dụng điều này để có được danh sách các tập tin sửa đổi giữa hai bộ thay đổi:

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

Vâng, nhưng trạng thái có thể khá tiện dụng (đối với trường hợp không, bạn có thể muốn grep để hiển thị tất cả các tệp ngoại trừ những tệp đã bị xóa với một cái gì đó nhưgit diff --name-status .. | grep ^[^D] | cut -f2
Pierre-Adrien Buisson


14

Ngoài ra git whatchanged, mức độ thấp hơngit log

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

Nó đưa ra bản tóm tắt cam kết với một danh sách các tệp bên dưới nó với các chế độ của chúng và nếu có thêm ( A), xóa ( D) hoặc sửa đổi ( M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

Sẽ cung cấp một cái gì đó như:

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

Tôi biết câu trả lời này không thực sự khớp "không có thông tin không liên quan.", Nhưng tôi vẫn nghĩ rằng danh sách này hữu ích hơn chỉ là tên tệp.


Thêm vào đó, chỉ cần một lệnh whatchangedthay vì cung cấp các tham số.
Gabrielius

11

Tôi thích điều này:

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

Tôi nghĩ rằng điều này sẽ đưa các trạng thái tệp A& D(thêm và xóa) trở lại, bởi vì nó hiển thị khác biệt so với cam kết đã chỉ định với cam kết trước đó, thay vì ngược lại. Nó phải git diff --name-status <SHA1>^ <SHA1>.
Troy Gizzi

11

Sử dụng lệnh một dòng đơn giản, nếu bạn chỉ muốn danh sách các tệp được thay đổi trong lần xác nhận cuối cùng:

git diff HEAD~1 --name-only

8

Liệt kê các tệp đã thay đổi trong một cam kết:

git diff --name-only SHA1^ SHA1

Điều này không hiển thị thông điệp tường trình, thêm dòng mới hoặc bất kỳ sự lộn xộn nào khác. Điều này làm việc cho bất kỳ cam kết, không chỉ là hiện tại. Bạn không chắc chắn lý do tại sao nó đã không khá được đề cập, vì vậy tôi thêm nó.


Hai cái này trông giống nhau: git diff SHA1^ SHA1git show SHA1.
Vladimir Vukanac

1
@mrW Những lệnh này tạo ra đầu ra tương tự, nhưng git showcũng hiển thị thông báo cam kết
Newtonx

8

Hiển thị nhật ký.

CAM KẾT có thể để trống ("") hoặc sha-1 hoặc sha-1 rút ngắn.

git log COMMIT -1 --name-only

Điều này sẽ chỉ liệt kê các tập tin, rất hữu ích để xử lý thêm.

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

8

Tìm thấy một câu trả lời hoàn hảo cho điều này:

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

Để tôi có thể biết

which files were just modified M

Which files were newly added , A

Which files were deleted , D

5

Một sự kết hợp của " git show --stat" (cảm ơn Ryan) và một vài lệnh sed sẽ cắt giảm dữ liệu cho bạn:

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

Điều đó sẽ chỉ tạo ra danh sách các tập tin sửa đổi.


5

Có một mẹo đơn giản để xem dưới dạng danh sách tệp, chỉ cần thêm :sau khi băm.

git show 9d3a52c474:

Sau đó bạn có thể khoan vào,

git show 9d3a52c474:someDir/someOtherDir

Nếu bạn nhấn một tệp, bạn sẽ nhận được phiên bản thô của tệp; mà đôi khi là những gì bạn muốn nếu bạn chỉ tìm kiếm một tài liệu tham khảo hoặc các đoạn mã quan trọng (khác biệt có thể khiến mọi thứ trở nên lộn xộn),

git show 9d3a52c474:someDir/someOtherDir/somefile

Hạn chế duy nhất của phương pháp này là nó không dễ dàng hiển thị một cây tệp.



2

Tôi sử dụng điều này để có được danh sách các tập tin thay đổi trong hợp nhất cam kết

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

hoặc là

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

2

Nếu bạn đang sử dụng plugin oh-my-zsh và git, phím tắt glg rất hữu ích.


3
Bạn vừa ... cắt tất cả mã từ câu trả lời của bạn? Đây không phảitất cả những gì tôi đề cập đến. Không có thông tin bên ngoài trong kết quả đầu ra như OP yêu cầu, không phải trong câu trả lời của bạn! Bạn vẫn có câu trả lời cho ra rất nhiều thông tin không liên quan. Nhưng bây giờ, nó chỉ được mô tả ít chính xác hơn. OP muốn đưa ra một danh sách các tập tin, và không có gì nữa. Nhìn vào những gì glgđầu ra: nhiều hơn nữa. Xin lỗi vì sự nhầm lẫn.
RomainValeri

0

Chỉ danh sách tập tin (thậm chí không cam kết tin nhắn):

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

Ví dụ: mở tất cả các tệp đã thay đổi trong trình chỉnh sửa của bạn:

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

-2

Tôi nghĩ rằng tôi sẽ chia sẻ một bản tóm tắt về bí danh của mình .. tôi cũng thấy việc sử dụng 'zsh' tuyệt vời với git it chroma phím mọi thứ độc đáo và nói với bạn rằng chi nhánh luôn luôn bằng cách thay đổi dấu nhắc lệnh.

Đối với những người bao trùm từ SVN, bạn sẽ thấy điều này hữu ích: (đây là sự kết hợp các ý tưởng từ các chủ đề khác nhau, tôi chỉ tin tưởng vào việc sử dụng bản sao / dán)

.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

Điều này sẽ làm việc:

git status

Điều này sẽ cho thấy những gì không được dàn dựng và những gì được dàn dựng.


7
Câu hỏi là về việc lấy danh sách các tệp trong một cam kết đã cam kết trước đó, chứ không phải là cam kết sắp được cam kết.
Rupi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.