Làm thế nào để có được git diff với ngữ cảnh đầy đủ?


114

Làm thế nào để tạo bản vá phù hợp để xem xét trong nồi nấu ăn?

git diff branch master --no-prefix > patch

Điều này chỉ tạo ra 3 dòng ngữ cảnh. Vì vậy, tôi làm như sau

git diff --unified=2000 branch master --no-prefix > patch

Hy vọng rằng tất cả các tệp sẽ có ít hơn 2000 dòng. Có cách nào để yêu cầu git bao gồm tất cả các dòng trong tệp cho bản vá mà không cần phải chỉ định các dòng tối đa không?


3
Tôi đã đăng tùy chọn -U <infinity> để hiển thị toàn bộ tệp, dưới dạng một câu hỏi riêng biệt stackoverflow.com/questions/28727424/…
Aleksandr Levchuk

Câu trả lời:


54

Tôi biết điều này là cũ, nhưng tôi cũng không thích các giải pháp được mã hóa cứng, vì vậy tôi đã thử nghiệm điều này:

git diff -U$(wc -l MYFILE)

Sử dụng -U dường như là cách duy nhất để giải quyết vấn đề, nhưng sử dụng số dòng hứa hẹn rằng nó sẽ hoạt động cho cả một thay đổi nhỏ trong một tệp rất lớn.


1
<không cần thiết. git diff -U$(wc -l MYFILE) MYFILE
balki

2
Cảm ơn @balki, tôi đã thử đề xuất của bạn và nhận thấy rằng <pre> $ (wc -l MYFILE) </pre> mở rộng đến số dòng theo sau là tên tệp, vì vậy việc sử dụng tên tệp thứ hai cũng có thể bị bỏ qua. Tôi đang cập nhật câu trả lời của mình để phản ánh điều này.
Ezra

4
Đó là một sự khác biệt, có hai phiên bản của tệp. Điều gì sẽ xảy ra nếu phiên bản không có trên đĩa dài gấp đôi? -U với một con số thực sự lớn không thực sự an toàn hơn sao?
Eloff

@Eloff, đó là sự thật, cách tốt nhất là tối đa độ dài, vì những con số thực sự lớn vẫn có vấn đề ngược lại. Giải pháp này giả định rằng không có lần xóa liền kề nào lớn hơn kích thước tệp hiện tại trên đĩa được thực hiện.
Ezra

3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILElà một câu trả lời tốt hơn phân tích cú pháp chính xác kết quả đầu ra wcbằng cách chỉ lấy số dòng không có khoảng trắng, không dựa vào kết quả đầu ra không được trích dẫn của một vỏ con để tạo hai đối số và hoạt động trên macOS / BSD.
anishpatel

94

Điều này dường như hoạt động khá tốt:

git diff --no-prefix -U1000

Với lời cảnh báo:

Các -Ucờ xác định dòng ngữ cảnh. Bạn có thể cần phải tăng điều này nếu có hơn 1000 dòng giữa các thay đổi của bạn.


16
Các -Utùy chọn mà bạn đề nghị là giống như các --unified=tùy chọn được sử dụng bởi Người hỏi. Sự khác biệt duy nhất là bạn chỉ định ít dòng ngữ cảnh hơn, 1000, so với người hỏi đã sử dụng, 2000. @balki muốn biết cách tăng số lượng lên vô cùng, nhưng bạn đề xuất cắt con số này đi một nửa. Tại sao?
LS

4
@LS: vâng, tôi nhận ra bây giờ, nhưng đã bỏ qua điều đó vài năm trước. Tuy nhiên, điều gì đang xảy ra rõ ràng hơn một chút so với câu hỏi và dường như giúp ích cho kẻ kỳ quặc hạ cánh ở đây.
c24w

Cảm ơn vì điều này, nó cũng hoạt động tuyệt vời với git show!
Shakeel

@ c24w Đã đồng ý, vẫn cho tôi những gì tôi muốn xem trên màn hình.
Chef Pharaoh

1
Các --no-prefixtùy chọn được loại bỏ các tiền tố “/ a /” và “/ b /” đích xuất hiện theo mặc định. (trang được liên kết)
luckydonald

10

Lưu ý: git1.8.1rc1 thông báo (ngày 8 tháng 12 năm 2012) bao gồm:

Một biến cấu hình mới " diff.context" có thể được sử dụng để cung cấp số lượng dòng ngữ cảnh mặc định trong đầu ra bản vá, để ghi đè mặc định được mã hóa cứng là 3 dòng.

để có thể giúp, tại đây, tạo ra một ngữ cảnh hoàn chỉnh hơn.


7
Tuy nhiên, điều đó không có tùy chọn để nói 'Tất cả các dòng trong tệp'
balki 11/12/12

3
Tôi nghi ngờ rằng đặt một số lớn, điều đó sẽ mô phỏng "tất cả các dòng"
VonC

7
"Tôi nghi ngờ rằng đặt một số lớn, điều đó sẽ mô phỏng" tất cả các dòng "" ... ngoại trừ trường hợp nó không xảy ra và sau đó mọi thứ bị hỏng. Tất cả đồng nghĩa với vô hạn, và một con số rất lớn chỉ có vậy - một con số, không phải vô hạn.
Trenton

4

Có cảm hứng và vì vậy tôi đã thêm một bí danh git.

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>

Cập nhật:

Chỉ tìm thấy "git df" đôi khi không hoạt động, do thay đổi thư mục khi thực thi bí danh git. (Xem các bí danh git hoạt động trong thư mục sai ). Vì vậy, đây là phiên bản cập nhật:

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0


0

Các giải pháp được chấp nhận trước đây không hoạt động với tôi khi xem một tệp / cam kết cụ thể ( -Utùy chọn có vẻ như gây rối với phân tích cú pháp rev / đường dẫn), nhưng --inter-hunk-context=hoạt động trong trường hợp này trên git version 2.24.0:

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

Nếu bạn không biết kích thước tệp, tất nhiên bạn có thể tìm thấy nó bằng cách wc -lthay vì mã hóa cứng:

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
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.