2012-05-07 51 views
10

我在.git/info/attributes中設置了*.py diff=python。所以Git知道函數的邊界。 git diff -W甚至可以確保顯示整個函數。將Git限制爲一個或多個函數?

但是有沒有辦法將git diff的輸出限制到一個特定的函數(或多個)?

(如果做不到這一點,我想這是AWK ...)

EDIT這也將爲git loggit rev-list是有用的:不要告訴我每一個承諾會修改views.py,告訴我那個承諾修改它有一定的功能。 (是的,在一個理想的世界,views.py不會是2000線的龐然大物經常被8名不同的開發人員修改...)

+1

您可能會發現這個值得閱讀:http://stackoverflow.com/questions/523307/semantic-diff-utilities – JosefAssad

+0

是啊這很有趣,但它看起來像一個相當不成熟的領域。 –

回答

2

好的,感謝Birei,我們有一個解決方案。

使用awk腳本中這個問題的答案,再加上一點的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 

用法示例:grit funcdiff 009e75 8b7a14 ./staging.py write_uploaded

這也可以在〜添加爲git的別名/.gitconfig

1

我沒有發現任何其他選項(除了--function-context或其-W短等選項,已經提到)能夠將差異輸出限制爲單個函數。

即使是-W選項是不夠的,知道「功能」可以從語言有很大不同語言,如圖所示在此blog post

我發現這個選項相當不可靠,至少在一個大的PHP類中。
我的測試發現--function-context經常導致顯示幾乎所有的原始文件,而git似乎對PHP的函數邊界一無所知。
更改前後的上下文行數似乎是隨機的,並且diff並不一定總是顯示函數的所有行。

介紹了這種變化的original patch message帶來了曙光:

此實現具有相同的缺點作爲一個在grep的,即沒有辦法明確查找函數的結束。
這意味着顯示幾行額外的上下文,直到下一個識別的函數開始。

所以它似乎檢測到一個函數的邊界是困難的混帳。
看來在這種情況下,git從來沒有檢測到函數邊界並給出了整個文件的上下文。


作爲OP Steve Bennett指出,一個可能的解決方案將是,以限定一個git別名這將修改前後提取在修正的功能,以diff的那些2「溫度」文件。
Creating Git Aliases」和「Bash script to select a single Python function from a file」中的示例。

這是一個即席解決方案,它將能夠解析OP在他的回購中正好與之合作的特定類型的源。

+0

是的,我現在正在嘗試另一種方法,使用git別名和腳本來解析文件:http://stackoverflow.com/questions/10512351/bash-script-to-select-a-single-python-function-從文件 我受到這篇文章的啓發,我完全隨機地遇到:http://davidwalsh.name/git-aliases –

+0

@SteveBennett有趣的方法。爲了提高可見性,我將它列入答案中,並將此特別解決方案與缺乏更「通用」功能的對比。 – VonC