2013-06-27 34 views
4

我需要找到從存儲庫中的任何文件添加或刪除的特定字符串的每個實例。Git搜索回購所有曾經包含字符串的文件的名稱

到目前爲止,我已經在各種組合嘗試

git log -S'string' --all 
git log --follow -p path/to/file 
git show --pretty="format:" --name-only <hash> 
git diff $(git log -S'string' -i --all --pretty="%H") | tee output.txt 

我所能得到的是成千上萬文件的列表,這些文件是涉及'字符串'的提交的一部分。我只需要列出那些在某些時候包含'string'的文件。

回答

4

git log -Sstring -p提供所有的輸出,這是很容易提取的文件名:

git log -p -Sstring --all | grep '^---\|^+++' | grep -v /dev/null \ 
          | sed 's%^\(---\|+++\) [ab]/%%' 
+0

+1看起來很令人費解的信任,這將工作 –

+0

+1我不知道'-p'會與'-S'組合時只輸出匹配文件的補丁,非常有用! – georgebrock

+0

@GabrielePetronella'git log'做了很多努力 - grep/sed只顯得複雜,但實際上並不重要。有一個diff選項來列出文件名會很好,但是我還沒有找到一個可以與'git log'一起工作的OP,因爲OP在這裏需要它。 – user4815162342

0

使用git grep的

git log --all --format=format:%H | xargs -n 1 git grep -i -I --full-name "perl" 

這人會搜索Perl的出現對於每次提交,輸出就是這個樣子。

c3eab7df88fdc5e848fd13fdab4298afd24f9ee8:bugzilla/bugzilla.pl:#!/usr/bin/perl 

實際上可能不會解決你的問題,你想知道什麼時候添加它,並刪除

0

您可以使用shell腳本來遍歷所有當前的Git跟蹤的文件,然後再確定是否或不是每個文件都包含字符串:

for f in $(git ls-files); do 
    commits=$(git log -S'string' --oneline -- $f | wc -l) 
    if [[ $commits -gt 0 ]]; then 
    echo $f 
    fi 
done 

這不會列出任何用來包含字符串但隨後被刪除的文件。

相關問題