2011-04-19 36 views
2

有沒有一種很好的方式來使用git來識別歷史中每個修訂版本中的所有修改函數?我試過使用-p開關,但它看起來不像svn的show-c-function參數那樣工作。使用git來識別修訂版本中的所有修改函數

我的假設是我想用「git diff HEAD〜i HEAD〜i-1 -p」來增加i的值。我是否遺漏了一些參數,這些參數有助於確定差異對已修改函數的最佳猜測?

+0

啓發你能解釋一下更清楚你在找什麼?你試圖複製Subversion的show-c-function行爲是什麼?您想如何確定功能已更改?你想要輸出看起來像什麼? – 2011-04-19 19:30:51

+0

對於每個修訂,如果一個.c文件受到影響,並且在函數內發生了一些更改,我想要有相應的函數定義。例如,如果int foo()的主體被改變了,我想以類似於svn的show-c-function的方式看到「int foo()」。 – swrittenb 2011-04-19 19:31:44

+0

我不知道是否有專門爲JavaScript構建的東西。那會很好 – 2017-04-21 09:34:20

回答

2

下面是我認爲你要做的一個快速和骯髒的嘗試。它執行git log來顯示所有修訂,-p將差異包含在日誌中,grep僅包含提交ID和大塊頭的行,並使用sed來過濾行號,只留下猜測Git在Hunk頭後寫入的函數名稱。

git log -p | grep -E '^(commit|@@)' | sed 's/@@.*@@//' 
+0

這個解決方案已經過時,並且在git版本> = 2.7.4時不起作用。你能否更新它?謝謝。 – UnchartedWaters 2017-08-08 10:47:59

2

這裏是一個神奇的到內git diff*

git diff |     \ 
grep -E '^(@@)' |   \ 
grep "(" |     \ 
sed 's/@@.*@@//' |   \ 
sed 's/(.*//' |    \ 
awk -F " " '{print $NF}' | \ 
uniq 

列出函數...和它的作用是...

  1. 獲取當前的差異,
  2. 下一緯紗只用「大塊報頭」的行,
  3. 下拾取僅與左括號線(爲可能包含功能名),
  4. 下忽略該大塊標頭,
  5. 開口後下忽略文本括號,
  6. 接下來只選擇緊接在左括號之前的單詞
  7. 並且最後忽略列表中同一單詞的多次出現。

瞧!你有一個由當前git diff修改的功能列表。


*在Ubuntu 16.04使用git version 2.7.4運行bash驗證。

+0

另外,如果函數定義被打印在diff中,那麼它不起作用,因爲它不會被打印爲標題。它可以很好地從頭文件中提取。 – Loren 2017-10-18 19:45:32

+0

爲了達到這個目的,你霧中有一個'.gitattributes'文件,指定每個文件的語言,以便diff找到正確的頭文件。說明創建一個:https://stackoverflow.com/a/7347993/3854385 – Loren 2017-10-18 20:16:48

0

您可以使用git textconv過濾器在修訂中列出所有已修改的函數。這個想法是創建一個特定的過濾器,列出所有的功能/方法,併爲所有的功能,一個身體的校驗和。這使這種過濾TEXTCONV觀點:

m() 12 
bar() 42 

(這裏m()是一個函數簽名,12是其身體的校驗))

git diff使用的兩個版本這個過濾器前後修訂:

  • 如果附加功能,線在DIFF加入

實施例:FOO加入

m() 12 
+ foo() 24 
bar() 42 
  • 如果一個函數被修改,校驗和改變,並且線在DIFF更新

實施例:foo的主體被修改

m() 12 
- foo() 23 
+ foo() 24 
bar() 42 

如何做到這一點?

  1. 創建過濾器:java-ls-methods.groovy是使用Groovy和Spoon
  2. 註冊在git的這個過濾器這樣的過濾器的實現:git config diff.java-ls-methods.textconv /home/path/to/java-ls-methods.groovy
  3. 准此過濾器,Java文件:echo "*.java diff=java-ls-methods" >> .gitattributes
  4. 充分利用DIFF: git diff(差異對最後提交)或git diff master(差異對另一個分支)
  5. 一旦你的差異完成,註釋行.gitattributes回到一個正常的差異

現金解決方案從https://stackoverflow.com/a/16929266

相關問題