Do quan liêu, tôi cần lấy danh sách tất cả các tệp đã thay đổi trong kho lưu trữ của mình để báo cáo (tôi bắt đầu với mã nguồn hiện có).
Tôi nên chạy cái gì để có danh sách này?
Do quan liêu, tôi cần lấy danh sách tất cả các tệp đã thay đổi trong kho lưu trữ của mình để báo cáo (tôi bắt đầu với mã nguồn hiện có).
Tôi nên chạy cái gì để có danh sách này?
Câu trả lời:
Đối với các tệp được thay đổi giữa SHA đã cho và cam kết hiện tại của bạn:
git diff --name-only <starting SHA> HEAD
hoặc nếu bạn muốn bao gồm các tệp đã thay đổi nhưng chưa được cam kết:
git diff --name-only <starting SHA>
Tổng quát hơn, cú pháp sau sẽ luôn cho bạn biết các tệp nào đã thay đổi giữa hai lần xác nhận (được chỉ định bởi SHA hoặc tên khác của chúng):
git diff --name-only <commit1> <commit2>
git diff --name-only <SHA> <SHA>^
--name-status
cờ thay vì --name-only
tiện dụng để lấy danh sách các tệp và xem trạng thái sửa đổi của chúng, chẳng hạn như Đã thêm hoặc Sửa đổi.
--name-status
cho thấy những gì đã xảy ra với họ
Để tìm tên của tất cả các tệp được sửa đổi kể từ lần xác nhận cuối cùng của bạn:
git diff --name-only
Hoặc (để biết thêm một chút thông tin, bao gồm các tệp chưa được theo dõi):
git status
Để liệt kê tất cả unstaged theo dõi thay đổi tập tin:
git diff --name-only
Để liệt kê tất cả các tập tin thay đổi theo dõi theo giai đoạn :
git diff --name-only --staged
Để liệt kê tất cả các tập tin đã thay đổi theo giai đoạn và không theo dõi:
{ git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
Để liệt kê tất cả các tệp chưa được theo dõi (những tệp được liệt kê bởi git status
, vì vậy không bao gồm bất kỳ tệp nào bị bỏ qua):
git ls-files --other --exclude-standard
Nếu bạn đang sử dụng này trong một kịch bản shell, và bạn muốn lập trình kiểm tra nếu các lệnh quay trở lại bất cứ điều gì, bạn sẽ được quan tâm git diff
's --exit-code
lựa chọn.
Khi tôi đã thêm / sửa đổi / xóa nhiều tệp (kể từ lần xác nhận cuối cùng), tôi muốn xem xét các sửa đổi đó theo thứ tự thời gian.
Cho rằng tôi sử dụng:
Để liệt kê tất cả các tệp không theo giai đoạn:
git ls-files --other --modified --exclude-standard
Để có được ngày sửa đổi cuối cùng cho mỗi tệp:
while read filename; do echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename; done
Mặc dù ruvim gợi ý trong các ý kiến :
xargs -0 stat -c '%y %n' --
Để sắp xếp chúng từ cũ nhất đến gần đây hơn:
sort
Một bí danh làm cho nó dễ sử dụng hơn:
alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename; done|sort'
Hoặc (ngắn hơn và hiệu quả hơn, nhờ ruvim )
alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'
Ví dụ:
username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd
Bây giờ tôi có thể xem lại các sửa đổi của mình, từ cũ nhất đến gần đây hơn.
xargs
và gọi một lần stat
? Một lớp lót đầy đủ:git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
Tôi cần một danh sách các tệp đã thay đổi nội dung giữa hai lần xác nhận (chỉ được thêm hoặc sửa đổi), vì vậy tôi đã sử dụng:
git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>
Các tùy chọn bộ lọc khác nhau từ tài liệu git diff :
bộ lọc diff = [(A | C | D | M | R | T | U | X | B) [[]]]
Chỉ chọn các tệp được thêm (A), Sao chép (C), Đã xóa (D), Sửa đổi (M), Đổi tên (R), có loại của chúng (ví dụ: tệp thông thường, symlink, mô hình con, Thay đổi) (T), là Unmerged (U), Unknown (X) hoặc đã ghép nối Broken (B). Bất kỳ sự kết hợp của các ký tự bộ lọc (bao gồm không có) có thể được sử dụng. Khi * (Tất cả hoặc không) được thêm vào kết hợp, tất cả các đường dẫn được chọn nếu có bất kỳ tệp nào khớp với các tiêu chí khác trong so sánh; nếu không có tệp phù hợp với tiêu chí khác, không có gì được chọn.
Ngoài ra, những chữ cái viết hoa này có thể được rút gọn để loại trừ. Ví dụ: --diff-filter = quảng cáo loại trừ các đường dẫn được thêm và xóa.
Nếu bạn cũng muốn liệt kê trạng thái (ví dụ A / M), hãy đổi --name-only
thành --name-status
.
Danh sách sửa đổi chưa được chỉnh sửa có thể được lấy bằng cách sử dụng git status
và grep
lệnh như dưới đây. Một cái gì đó như git status -s | grep M
:
root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
M src/.../file1.js
M src/.../file2.js
M src/.../file3.js
....
Với git show
bạn có thể nhận được một kết quả tương tự. Để xem cam kết (giống như giao diện git log
) với danh sách các tệp được bao gồm, hãy sử dụng:
git show --name-only [commit-id_A]^..[commit-id_B]
Đâu [commit-id_A]
là cam kết ban đầu và [commit-id_B]
là cam kết cuối cùng mà bạn muốn thể hiện.
Đặc biệt chú ý với ^
biểu tượng. Nếu bạn không đặt điều đó, thông tin commit-id_A sẽ không triển khai.
Nếu bạn muốn kiểm tra các tệp đã thay đổi, bạn cần quan tâm đến nhiều thứ nhỏ nhất sẽ sử dụng tốt nhất, như nếu bạn muốn kiểm tra tệp nào đã thay đổi chỉ cần nhập
trạng thái git - nó sẽ hiển thị các tệp có thay đổi
sau đó nếu bạn muốn biết những thay đổi nào sẽ được thực hiện thì có thể kiểm tra theo cách,
git diff - sẽ hiển thị tất cả các thay đổi trong tất cả các tệp
nó chỉ tốt khi chỉ có một tập tin được sửa đổi
và nếu bạn muốn kiểm tra tập tin cụ thể thì hãy sử dụng
khác biệt