有沒有一種很好的方式來使用git來識別歷史中每個修訂版本中的所有修改函數?我試過使用-p開關,但它看起來不像svn的show-c-function參數那樣工作。使用git來識別修訂版本中的所有修改函數
我的假設是我想用「git diff HEAD〜i HEAD〜i-1 -p」來增加i的值。我是否遺漏了一些參數,這些參數有助於確定差異對已修改函數的最佳猜測?
有沒有一種很好的方式來使用git來識別歷史中每個修訂版本中的所有修改函數?我試過使用-p開關,但它看起來不像svn的show-c-function參數那樣工作。使用git來識別修訂版本中的所有修改函數
我的假設是我想用「git diff HEAD〜i HEAD〜i-1 -p」來增加i的值。我是否遺漏了一些參數,這些參數有助於確定差異對已修改函數的最佳猜測?
下面是我認爲你要做的一個快速和骯髒的嘗試。它執行git log
來顯示所有修訂,-p
將差異包含在日誌中,grep
僅包含提交ID和大塊頭的行,並使用sed
來過濾行號,只留下猜測Git在Hunk頭後寫入的函數名稱。
git log -p | grep -E '^(commit|@@)' | sed 's/@@.*@@//'
這個解決方案已經過時,並且在git版本> = 2.7.4時不起作用。你能否更新它?謝謝。 – UnchartedWaters 2017-08-08 10:47:59
這裏是一個神奇的唄到內git diff
*
git diff | \
grep -E '^(@@)' | \
grep "(" | \
sed 's/@@.*@@//' | \
sed 's/(.*//' | \
awk -F " " '{print $NF}' | \
uniq
列出函數...和它的作用是...
- 獲取當前的差異,
根- 下一緯紗只用「大塊報頭」的行,
- 下拾取僅與左括號線(爲可能包含功能名),
- 下忽略該大塊標頭,
- 開口後下忽略文本括號,
- 接下來只選擇緊接在左括號之前的單詞
- 並且最後忽略列表中同一單詞的多次出現。
瞧!你有一個由當前git diff
修改的功能列表。
*在Ubuntu 16.04使用git version 2.7.4
運行bash驗證。
您可以使用git textconv過濾器在修訂中列出所有已修改的函數。這個想法是創建一個特定的過濾器,列出所有的功能/方法,併爲所有的功能,一個身體的校驗和。這使這種過濾TEXTCONV觀點:
m() 12
bar() 42
(這裏m()
是一個函數簽名,12
是其身體的校驗))
當git diff
使用的兩個版本這個過濾器前後修訂:
實施例:FOO加入
m() 12
+ foo() 24
bar() 42
實施例:foo的主體被修改
m() 12
- foo() 23
+ foo() 24
bar() 42
如何做到這一點?
git config diff.java-ls-methods.textconv /home/path/to/java-ls-methods.groovy
echo "*.java diff=java-ls-methods" >> .gitattributes
git diff
(差異對最後提交)或git diff master
(差異對另一個分支).gitattributes
回到一個正常的差異
啓發你能解釋一下更清楚你在找什麼?你試圖複製Subversion的show-c-function行爲是什麼?您想如何確定功能已更改?你想要輸出看起來像什麼? – 2011-04-19 19:30:51
對於每個修訂,如果一個.c文件受到影響,並且在函數內發生了一些更改,我想要有相應的函數定義。例如,如果int foo()的主體被改變了,我想以類似於svn的show-c-function的方式看到「int foo()」。 – swrittenb 2011-04-19 19:31:44
我不知道是否有專門爲JavaScript構建的東西。那會很好 – 2017-04-21 09:34:20