Tạo git diff --stat hiển thị đường dẫn tệp đầy đủ


104

Khi thực hiện, git diff --statmột số tệp được liệt kê với đường dẫn đầy đủ từ cơ sở kho lưu trữ nhưng một số tệp được liệt kê là:

.../short/path/to/filename.  

Đó là con đường bắt đầu với ...và chỉ con đường ngắn được hiển thị.

Tôi muốn git diffliệt kê đường dẫn tệp đầy đủ cho tất cả các tệp để dễ dàng xử lý bằng tập lệnh. Có cách nào tôi có thể làm git diffđể luôn hiển thị đầy đủ đường dẫn không

Câu trả lời:


108

Các git difflệnh có giá trị bắt buộc đối với --stat:

--stat[=<width>[,<name-width>[,<count>]]]
       Generate a diffstat. You can override the default output width for
       80-column terminal by --stat=<width>. The width of the filename
       part can be controlled by giving another width to it separated by a
       comma. By giving a third parameter <count>, you can limit the
       output to the first <count> lines, followed by ...  if there are
       more.

       These parameters can also be set individually with
       --stat-width=<width>, --stat-name-width=<name-width> and
       --stat-count=<count>.

(Đối với tập lệnh, bạn có thể muốn sử dụng git diff-treetrực tiếp vì nó giống lệnh "ống nước" hơn, mặc dù tôi nghĩ rằng bạn sẽ ổn cả. Lưu ý rằng bạn cần có cùng văn bản --statkhi sử dụng git diff-tree. Sự khác biệt cơ bản giữa việc sử dụng git diff"sứ "giao diện người dùng và git diff-treelệnh đường ống dẫn nước, là git difftìm kiếm cài đặt đã định cấu hình của bạn cho các tùy chọn như diff.renamesquyết định xem có thực hiện phát hiện đổi tên hay không. Điều đó, cộng với giao diện người dùng git diffsẽ thực hiện tương tự git diff-indexnhư nếu bạn so sánh một cam kết với chỉ mục chẳng hạn. Nói cách khác, git diff đọc cấu hình của bạntự động gọi đường ống dẫn nước phù hợp .)


6
git diff --numstat cũng giống như diff-cây
cmcginty

1
Lưu ý rằng để giới hạn chiều rộng của phần cuối cùng (+++ / ---) bạn có thể sử dụng một --stat-graph-width=...công tắc riêng . Cũng lưu ý rằng thiết lập cao --stat-graph-width=--stat-name-width=vẫn chưa đủ, bạn cũng phải thiết lập --stat-width=đủ lớn để che hai.
jakub.g

@ jakub.g: điểm tốt. Dựa trên một chút tìm hiểu trong mã nguồn git, điều này đã xảy ra với git 1.7.10.
torek

4
Có cách nào để toàn cầu hóa điều này không? Gõ nó lần nào cũng phát điên.
Rudie

@Rudie: than ôi, không: có một biến cấu hình diff.statGraphWidthbạn có thể sử dụng để đặt --stat-graph-widthgiá trị, nhưng những biến khác mặc định là chiều rộng đầu cuối của bạn. (Vì vậy, câu trả lời thay thế: "có, chỉ cần làm cho cửa sổ đầu cuối của bạn rộng 1000 cột" :-))
torek

22

Để xử lý tập lệnh, tốt hơn nên sử dụng một trong những cách sau:

# list just the file names
git diff --name-only
path/to/modified/file
path/to/renamed/file


# list the names and change statuses:
git diff --name-status
M       path/to/modified/file
R100    path/to/existing/file   path/to/renamed/file


# list a diffstat-like output (+ed lines, -ed lines, file name):
git diff --numstat
1       0       path/to/modified/file
0       0       path/to/{existing => renamed}/file

Mỗi cái này trở nên tiện dụng hơn cho việc xử lý tập lệnh mạnh mẽ khi được kết hợp với -ztùy chọn, được sử dụng NULlàm trình kết thúc trường.


Theo các thử nghiệm của tôi, bạn không nhận được đường dẫn đầy đủ của tài nguyên bằng các lệnh này. Hiện tại, tôi chỉ thấy các đường dẫn tương đối cho các tệp đã xóa. Tôi không biết nếu đây chỉ là trường hợp cho những tệp này.
GCallie

1
Tất cả outpu sẽ trả về các đường dẫn liên quan đến git rev-parse --show-toplevel. Vấn đề ban đầu là đề cập đến các đường dẫn bị cắt ngắn, đây là một vấn đề trong số liệu thống kê khác, đặc biệt là đối với tên tệp dài hoặc giá trị thấp cho --stat-name-width. Các lệnh trên sẽ không cắt bớt đường dẫn, nhưng sẽ hiển thị đường dẫn "đầy đủ" theo yêu cầu, mặc dù vẫn liên quan đến gốc kho lưu trữ.
cmbuckley

18

Đối với người dùng Bash, bạn có thể sử dụng $COLUMNSbiến để tự động lấp đầy chiều rộng thiết bị đầu cuối có sẵn:

git diff --stat=$COLUMNS

Tên đường dẫn rất dài có thể vẫn bị cắt bớt; trong trường hợp này, bạn có thể giảm chiều rộng của phần +++ / --- bằng cách sử dụng --stat-graph-width, ví dụ: điều này giới hạn nó ở 1/5 chiều rộng đầu cuối:

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))

Đối với một giải pháp chung chung hơn, bạn có thể sử dụng đầu ra của tput colsđể xác định chiều rộng đầu cuối.


2
Có cách nào để toàn cầu hóa --stat=$COLUMNS,$COLUMNSkhông? Gõ nó lần nào cũng phát điên.
Rudie

@Rudie thêm export COLUMNSđể bạn ~/.bashrcvà trong chiến ~/.gitconfigdưới [alias], thêmsmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841

@ user151841 Điều đó chỉ thay đổi diff. Tôi muốn nó hoạt động cho hợp nhất và kéo, v.v. (Thậm chí không thể làm thủ công ở đó.) Tôi không nghĩ GIT hỗ trợ nó.
Rudie

@Rudie Vâng, sau khi kéo hoặc hợp nhất hoàn tất, bạn có thể khác biệt giữa băm trước và băm mới.
dùng151841

2
@ user151841 Chắc chắn rồi, nhưng việc hợp nhất đã cung cấp một bản tóm tắt thống kê. Không có tham số / cấu hình. Sẽ thật tuyệt nếu tất cả 'tóm tắt trạng thái' sử dụng cùng một cấu hình.
Rudie

4

Có một lựa chọn --name-only: git diff --name-only. Tùy chọn này cũng được hỗ trợ bởi các lệnh git khác như showstash.

Các đường dẫn không bị rút ngắn với tùy chọn.


0

Tôi đã tạo bí danh git sau:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

Nó đọc số cột từ tput colslệnh. Nó mặc định khác với master, nhưng bạn có thể tùy chọn chỉ định một nhánh khác.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

0

Một giải pháp đơn giản mà tôi tìm thấy là làm điều này: (chỉ hoạt động trên * nix, xin lỗi không có osx)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

Phiên bản này hoạt động cho cả hai, nhưng nó không đẹp trên osx.

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"

-1

Tôi thấy rằng hành vi của diff --stat đã thay đổi ở đâu đó xung quanh git 1.7.10, nơi trước đây nó sẽ rút ngắn đường dẫn tệp xuống một chiều rộng cố định theo mặc định - hiện nó hiển thị nhiều nhất có thể cửa sổ đầu cuối của bạn cho phép. Nếu bạn đang gặp sự cố này, hãy đảm bảo bạn nâng cấp lên 1.8.0 hoặc mới hơn.

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.