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


Tôi đang tìm kiếm một cách đơn giản git lệnh cung cấp 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 một băm (SHA1), không có thông tin không liên quan.

Tôi đã thử:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

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

Có cái nào khác không git lệnh 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ừ danh sách git show đầu ra?


2179
2018-01-08 12:26


gốc


Tôi đến đây tìm thứ gì đó hơi khác một chú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à tăng cường sử dụng git log --until 2013-05-21 --pretty="short" --name-only với một hiệu ứng tốt. - Limited Atonement
Sử dụng lệnh này để nhận tất cả thay đổi từ trước đó n cam kết cho đến master: git diff-tree --name-status -r @{3} master - ako


Các câu trả lời:


Cách ưa thích (bởi vì nó là một ống nước chỉ huy; có nghĩa là có lập trình):

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

Cách khác (ít được ưa thích hơn cho tập lệnh, vì đó là đồ sứ chỉ huy; 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

  • Các --no-commit-id ngăn chặn đầu ra ID cam kết.
  • Các --pretty đối số xác định một chuỗi định dạng trống để tránh sự trôi dạt ở đầu.
  • Các --name-only đối số chỉ hiển thị tên tệp bị ảnh hưởng (Cảm ơn Hank).
  • Các -r đối số là để recurse vào sub-tree

2866
2018-01-08 13:02



sứ mệnh lệnh không nên được sử dụng trong một kịch bản (git help) ,. Vui lòng sử dụng git diff-tree --no-commit-id --name-only -r <commit> thay thế - drizzt
Cần lưu ý rằng diff-tree sẽ không hoạt động khi nhìn vào cam kết gốc. - jbranchaud
Thay thế --name-only tùy chọn với --name-status sẽ cung cấp tóm tắt rõ ràng hơn. - Kurt Zhong
Nếu bạn muốn nó làm việc trên cam kết gốc, hãy sử dụng cờ --root. Từ trang người đàn ông: "Khi --root được chỉ định, cam kết ban đầu sẽ được hiển thị dưới dạng sự kiện tạo lớn. Điều này tương đương với sự khác biệt so với cây NULL". - Chris
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


Nếu bạn muốn nhận danh sách các tệp đã 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>

189
2018-01-14 19:22



Ls-tree với --name-only dường như không hoạt động trên 1.6.4.4 hoặc 1.6.3.3. Bạn có nghĩ đây là lỗi không? - krosenvold
Nó chỉ ra thứ tự của các tham số là đáng kể ở đây. Bài đăng trong bài đăng của bạn không hoạt động, trong khi bài đăng trong phản hồi của bạn làm làm việc - ít nhất là cho đến khi bạn cập nhật bài đăng của mình;) - krosenvold
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
@CoDEmanX: Bạn không bỏ lỡ việc thêm -r / -t tùy chọn, phải không? Bởi vì diff-tree xử lý cả các tệp đã sửa đổi và bổ sung. Nếu bạn muốn liệt kê tất cả các tệp mới (đã thêm), hãy sử dụng git diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish> - Jakub Narębski
Điều này có tầm thường không? - Niklas Rosencrantz


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


180
2018-01-08 12:34



--name-only là rất nhiều trong hầu hết các trường hợp mà tôi cần nó; Vì vậy, upvoted các giải pháp ngắn nhất (và là người duy nhất mà tôi sẽ nhớ trong 1 thử). - Erik S
Hoặc là --name-status. - Neil Traft
gitk là chính xác những gì tôi đã sau - cảm ơn. câu hỏi này bây giờ là điều đầu tiên xuất hiện trong tìm kiếm trên google, vì vậy nó đáng để mọi người biết rằng gitk tồn tại! Phần còn lại của bạn có thể giữ cho dòng lệnh của bạn faffing về; Tôi sẽ chỉ nhìn vào màn hình UI đẹp đó :) - Mr Spoon
Là một người thực sự thích CLI git, gitk thực sự là một cách tốt để xem lại các tệp và hiển thị tệp mà khác biệt đang bật. ví dụ. Mã xem xét một con quái vật cam kết từ một đồng đẳng. - Elijah Lynn


Cá nhân tôi sử dụng sự kết hợp của --stat và --một đường thẳng với chỉ chỉ huy:

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 thống kê thêm / xóa, bạn có thể thay thế --stat với - chỉ tên

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

114
2017-07-11 23:21



Điều đó thật tuyệt! Về cơ bản nó cung cấp cho 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 đó gits tự nó hiển thị các thay đổi mới nhất (trong HEAD), trong khi gits b24f5fb có thể được sử dụng để hiển thị mọi thay đổi của bản sửa đổi. - Brent Faust
Người ta cũng có thể tạo 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 tùy chọn commit-ish) và lấy kết quả từ các ví dụ đầu tiên ở trên. - lindes
Git cho Windows yêu cầu dấu ngoặc kép: git config --global alias.changes "show --stat --oneline" - Alchemistmatt
Tốt đẹp. Và không giống như câu trả lời được chấp nhận, git show cũng hoạt động để xem xét các thay đổi được lưu trữ: ví dụ: git show --stat --oneline stash@{1} - Jeff Ward


Gần đây tôi cần liệt kê tất cả các tệp đã thay đổi giữa hai lần commit. 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 dưới đây

git diff --name-only START_COMMIT..END_COMMIT

Sử dụng --name-status cũng sẽ bao gồm các thay đổi (thêm, sửa đổi, xóa vv) bên cạnh mỗi tập tin

git diff --name-status START_COMMIT..END_COMMIT

58
2018-04-26 12:23



Chỉ cần thử: Hoạt động tốt trong git bash trên Windows quá. - OregonGhost
Nếu bạn dùng git diff --name-status START_COMMIT..END_COMMIT thì bạn không cần dấu |sort | uniq. - Ethan
Chỉnh sửa 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. Cách 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 PNG và bố trí XML. - AutonomousApps


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, cam kết tin nhắn và các tập tin đã thay đổi.

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


56
2018-05-27 01:20





Dạng đơn giản nhất:

git show --stat (hash)

Đó là dễ dàng hơn để nhớ và nó sẽ cung cấp cho bạn tất cả cá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 bạn có thể thêm --name-only Tùy chọn.

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


48
2017-07-16 00:06



Tôi muốn biết lý do tại sao nếu câu trả lời của tôi là đơn giản và chính xác, tôi nhận được một phiếu bầu tiêu cực. - VaTo
Nếu tôi có nguy cơ đoán (và tôi chỉ đoán, vì không phải tôi đã bỏ phiếu bình chọn của bạn), đó là vì áp phích ban đầu đã yêu cầu một danh sách các tệp, mà không có bất kỳ thông tin nào khác. Lệnh bạn cung cấp hiển thị thông tin về cam kết và các loại thay đổi đã được thực hiện cho tệp. Tôi tìm thấy câu trả lời của bạn hữu ích cho cái gì khác, nếu đó là bất kỳ an ủi. - J. Gregory Wright
@ J.GregoryWright bạn có thể đúng, trong trường hợp đó tôi sẽ thêm - chỉ-tên và đó là nó. Tuy nhiên, tôi sử dụng lệnh mà tôi đã cung cấp vì nó dễ nhớ hơn. Nhưng tôi sẽ đặt hai lựa chọn đó chỉ trong trường hợp, cảm ơn đề xuất! - VaTo
- name-only sẽ vẫn 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 điệp cam kết. - devoured elysium
Câu trả lời hay nhất IMO, những người khác không đáng nhớ chút nào. - Amalgovinus


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

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

45
2018-04-29 13:13



upvote cho bí danh - Clint Eastwood