2013-10-16 59 views

回答

2

很容易判斷文件foo的內容將出現在回購某處的的md5sum:

file=foo # or argument to script, etc 
sha1=$(git hash-object -t blob $file) 
repotype=$(git cat-file -t $sha1 2>/dev/null) || { 
    echo "file \"$file\" is not in the repo" 
    exit 1 
} 
[ $repotype = blob ] || { 
    echo "uh oh: file \"$file\" matches non-file ($repotype) object" 
    exit 1 
} 

然而,僅僅因爲foo出現在回購作爲一個blob,並不意味着它出現在名稱bar(或者根本不可能,它可能是git add ed,但從未在提交下籤入)。所以現在看每一個承諾,你的目標路徑提取一滴-ID,跳過承諾,如果它不是在那裏(合理的):

target_path=bar 

git rev-list --branches |  # or --all, or HEAD, or (etc) 
while read id; do 
    file_id=$(git rev-parse -q --verify $id:$target_path) || continue 
    [ $file_id = $sha1 ] || continue 
    echo "found \"$file\" as \"$target_path\" in $id" 
    # do more here if you like, e.g., git show $id 
done 

如果你想找到它下的任何名稱,而比某些特定的明確名稱,您可以每個承諾找到所有blob s並檢查其ID。

(注:除了零碎的未經檢驗的,並且偶爾位可能已被重新輸入或沿途改變,當心拼寫錯誤或愚蠢的錯誤)

+0

美麗,制定正確的開箱。 – Patrick

0

使用的md5sumgit loggrep組合將工作:

for SHA in `git log --pretty=format:"%h" bar`; do 
    git show $SHA:bar | md5sum 
done | grep `md5sum foo| cut -d' ' -f1` 

上面的命令git log --pretty=format:"%h" bar獲取列表的所有承諾爲bar文件,然後我們做對他們中的每一個(git show的md5sum展現該提交中的文件)。最後,我們用grep foo文件

相關問題