2012-03-30 38 views
71

我環顧四周,一個指定的文件,我不知道這是可能的,但這裏有雲:Git的:所有的各種變化顯示爲一條直線在整個混帳歷史

我有一個(JavaScript)的文件(比如說/lib/client.js),其中我有分配給一個變量的唯一標識,就像這樣: var identifier = "SOME_IDENTIFIER";

你可以認爲像一個版本號標識的:每隔一段時間,我們就會將此變量更改爲新的標識符。

我想要做的是找到我們曾經使用過的所有唯一標識符。我怎麼能用git來做到這一點?

我想有可能是一種方法來搜索git的歷史,並打印匹配"var identifier ="匹配的行。我可以手動刪除這個列表。

無論如何,我會很感激這裏的任何見解。謝謝。

+2

可能重複[檢索文件中特定行的提交日誌?](http://stackoverflow.com/questions/8435343/retrieve-the-commit-log-for-a-specific-line-in -a-file) – 2015-04-09 09:11:12

回答

37

請參閱git-loggitdiffcore的手冊頁。我相信這個命令將做到這一點,但它可能不是很正確:

git log -G "var identifier =" file.js 

編輯:這裏是在艱難中起步的bash腳本來顯示實際行。這可能更符合你的需求。

for c in $(git log -G "something" --format=%H -- file.js); do 
    git --no-pager grep -e "something" $c -- file.js 
done 

它使用git log -G找到有趣的提交,使用--format=%H生產犯散列的列表。然後它遍歷每個有趣的提交,要求git grep顯示包含regex的提交和文件的行,以提交哈希開頭。


編輯:改爲使用-G,而不是-S在意見提出。

+0

@Rob - 感謝這個 - 儘管對你的腳本進行了小編輯 - 只是把文件名只顯示了那些影響那個文件的提交 - 如果一個提交引用了其他文件,它並沒有列出 – 2012-09-07 20:07:30

+0

@AdrianCornish - 很高興它是很有幫助。我認爲OP只想查看一個文件,但你完全正確地認爲刪除文件名可能是更普遍有用的腳本。 – rob 2012-09-09 01:19:02

+0

我有一個更困難的情況。有問題的文件從paht_a/file移到path_b/file。現在,當我在path_b中執行它時,它只會顯示文件從path_a移動到path_b時的更改。如果我在path_a中這樣做,它告訴我 致命:模棱兩可的參數'文件':未知修訂或路徑不在工作樹中。 – 2013-07-15 03:59:59

12

您還可以使用gitk做到這一點:

gitk file.js 

在「提交」下拉菜單中選擇「添加/刪除串:」,並在旁邊的文本框中,請輸入「VAR標識符=」 ,並且添加或刪除包含該字符串的行的任何提交都將突出顯示。

+0

這有助於確定添加了包含「var identifier =」的行的提交,但未顯示修改此行的後續提交。 – findchris 2012-03-30 20:35:52

+2

你有沒有試過'git blame file.js'或'git gui blame file.js'? – 2012-03-30 20:47:44

+0

我知道git blame是幹什麼的;我正在尋找完整的修訂歷史記錄,而不是一個差異。 – findchris 2012-03-30 20:50:23

6

如果你適應@搶劫的回答只是有點,git log基本上會爲你做這個,如果你需要的是一個可視化的比較:

git log -U0 -S "var identifier =" path/to/file 

-U0意味着補丁模式輸出(-p),並顯示補丁周圍的零環境。

你甚至可以做到這一點跨越分支:

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file 

有可能會抑制DIFF頭的方式,但我不知道的人。

+0

爲我工作!謝謝。 – 2015-12-30 00:11:17

54

因爲git 1.8。4,有一種更直接的方式來回答你的問題。

假設線110是行說var identifier = "SOME_IDENTIFIER";,那麼這樣做:

git log -L110,110:/lib/client.js 

這將返回所有提交這觸動該行代碼。

[Git Documentation(見 「-L」 命令行paramenter)

2

magit,你可以做到這一點與

l, =L 

然後它會問你的文件,並開始,結束行。

相關問題