2009-12-21 77 views
15

我剛纔讀的git-blame手冊一次,並注意到這部分:如何使用git檢測複製和粘貼的代碼?

一個特別有用的方法是看是否新添加的文件已經從現有的文件通過複製和粘貼創建行。有時候這表明開發者很sl and,沒有正確地重構代碼。你可以先找到犯介紹了與文件:

git的日誌--diff過濾= A = --pretty短 - 富

,然後註釋提交與其父母之間的變化,用提交^!表示法:

git blame -C -C -f $ commit ^! - foo

這聽起來很有趣,但我並不十分注意它是如何工作的,以及爲什麼。我不知道它是否可以在git鉤子中用來檢測粘貼代碼複製&。

一些git專家可以解釋一起使用上面的git命令的效果,以及是否可以使用類似的東西來讓git顯示是否存在代碼重複(也許通過使用git似乎相似的索引)重命名文件時計算)?

回答

10

您可以逐個拆分命令。

$ git log --diff-filter=A --pretty=short -- foo 

顯示文件「foo」的日誌。 --diff-filter選項僅顯示添加文件(「A」)的提交,並以精簡格式(--pretty=short選項)顯示。 (該--是說「沒有什麼下面是一個選項」,和其後的內容應在其上應用的日誌文件名列表的標準。)

然後:

$ git blame -C -C -f $commit^! -- foo 

git blame用來自上次提交的信息註釋文件的每一行。雙重-C -C選項主動檢查從其他文件複製的行。 -f選項顯示原始提交的文件名(這意味着如果一行是從另一個文件複製的,則會看到它從中複製的文件的名稱)。 $commit^!是$ commit的表示法;後綴^!意味着排除$ commit的所有父母。

所以基本上,第一個命令(git log)可以幫助您找到引入複製行的提交;第二個(git blame)可幫助您找到對於由git log返回的任何可疑提交。

+0

感謝您的解釋!雙重的'-C -C'標誌讓git非常有趣 – 2009-12-22 13:35:41