2012-05-07 37 views
10

Tôi đặt *.py diff=python trong .git/info/attributes. Vì vậy, Git biết ranh giới chức năng ở đâu. git diff-W thậm chí có thể đảm bảo toàn bộ hàm được hiển thị.Giới hạn Git Diff với một hoặc nhiều chức năng?

Nhưng có cách nào để giới hạn đầu ra của git diff chỉ với một hàm cụ thể (hoặc nhiều hơn một) không?

(Không đó, tôi đoán đó là awk ...)

EDIT này cũng sẽ có ích cho git loggit rev-list: không chỉ cho tôi mỗi cam kết rằng sẽ thay đổi views.py, chỉ cho tôi cam kết rằng sửa đổi một chức năng nhất định trong đó. (Có, trong một thế giới lý tưởng, views.py sẽ không phải là một dòng 2000 thường được sửa đổi bởi 8 nhà phát triển khác nhau ...)

+1

Bạn có thể thấy điều này đáng đọc: http://stackoverflow.com/questions/523307/semantic-diff-utilities – JosefAssad

+0

Vâng thú vị, nhưng nó trông giống như một lĩnh vực khá non nớt. –

Trả lời

2

Ok, nhờ Birei, chúng tôi có giải pháp.

Sử dụng các kịch bản awk trong câu trả lời đó, kết hợp với một chút bash:

~/scripts/grit:

#!/bin/bash 
cmd=$1 
shift 1 
if [ "$cmd" = "" ]; then 
    git 
# other commands not relevant to this question go here 
elif [ $cmd = "funcdiff" ]; then 
    git show "$1:$3" | awk -f ~/scripts/getfunc.awk -v f=$4 > /tmp/.tmp1 
    git show "$2:$3" | awk -f ~/scripts/getfunc.awk -v f=$4 > /tmp/.tmp2 
    git diff -W --no-index /tmp/.tmp1 /tmp/.tmp2 

else 
    git $cmd [email protected] 
fi 

Ví dụ sử dụng: grit funcdiff 009e75 8b7a14 ./staging.py write_uploaded

này cũng có thể được thêm vào như là một bí danh git trong ~ /.gitconfig

1

Tôi không tìm thấy bất kỳ tùy chọn nào khác (ngoài số --function-context hoặc -W ngắn của chúng tôi tùy chọn, đã được đề cập) có thể hạn chế đầu ra diff thành một hàm duy nhất.

Và thậm chí là -W tùy chọn không phải lúc nào đủ, biết rằng một 'chức năng' có thể khác nhau rất nhiều từ ngôn ngữ đến ngôn ngữ, như minh họa trong blog post này:

tôi đã tìm thấy tùy chọn này khá đáng tin cậy, ít nhất trong một lớp PHP lớn.
Các thử nghiệm của tôi được tìm thấy --function-context thường dẫn đến hiển thị hầu như tất cả tệp gốc và git xuất hiện không biết gì về ranh giới chức năng của PHP.
Số lượng các dòng ngữ cảnh trước và sau một thay đổi có vẻ ngẫu nhiên và sự khác biệt không nhất thiết phải luôn hiển thị tất cả các dòng của hàm.

Các original patch message mà giới thiệu sự thay đổi này đã làm rõ được ánh sáng:

thực hiện này có nhược điểm giống như một trong grep, cụ thể là không có cách nào để tìm một cách rõ ràng vào cuối của một hàm.
Điều đó có nghĩa là một vài dòng ngữ cảnh bổ sung được hiển thị, ngay lập tức chức năng được nhận diện tiếp theo sẽ bắt đầu.

Vì vậy, dường như việc phát hiện ra ranh giới của hàm rất khó cho git.
Có vẻ như trong trường hợp này, git không bao giờ phát hiện một ranh giới chức năng và cung cấp cho chúng ta ngữ cảnh của toàn bộ tệp.


Khi OP Steve Bennett điểm ra, một giải pháp tiềm năng sẽ được xác định một bí danh git đó sẽ trích xuất các chức năng trong phiên bản trước và sau khi chỉnh sửa, để diff trên những 2 'tạm thời' tập tin.
Ví dụ trong "Creating Git Aliases" và "Bash script to select a single Python function from a file".

Đây là giải pháp đặc biệt để có thể phân tích cú pháp loại nguồn cụ thể mà OP sẽ xảy ra để làm việc với trong repo của anh ta.

+0

Vâng, tôi hiện đang thử một tack khác, sử dụng bí danh git với tập lệnh để phân tích cú pháp tệp: http://stackoverflow.com/questions/10512351/bash-script-to-select-a-single-python-function- from-a-file Tôi đã được truyền cảm hứng từ bài đăng này, mà tôi đã chạy hoàn toàn ngẫu nhiên: http://davidwalsh.name/git-aliases –

+0

@SteveBennett Cách tiếp cận thú vị. Tôi đã bao gồm nó trong câu trả lời cho khả năng hiển thị nhiều hơn, và để tương phản giải pháp ad-hoc này với việc thiếu một tính năng "chung chung" hơn. – VonC

Các vấn đề liên quan