从一直连接git diffs

时间:2016-01-16 17:07:45

标签: git

我的repo中有一个文件,自我创建以来已被移动和更改了几次,我试图找到原始版本。我知道它在哪里,所以我想在创建回购之后,在所有git差异的连续列表中grep该位置。

请注意,我已从此repo中删除此文件,以将其放在更合适的位置。我想这可以让它变得更难......是否有一种简单的方法可以找到引入此文件的提交,即使它不再存在?

2 个答案:

答案 0 :(得分:1)

你可以找到像这样的文件foobar.cs的重命名

git log --summary --follow foobar.cs | grep -2 rename

--follow将强制git log跟随重命名,--summary将输出描述重命名时间的文字。 grep提取重命名,-2显示周围的两行,包括重命名的提交。

答案 1 :(得分:1)

如果你知道它的名字,你可以使用ls-tree -r和grep来捕获每个提交中文件的完整路径:

#!/bin/bash
filename_to_look_for=SpecRunner.html
commit_range=1cb1d..e172

echo Looking for file $filename_to_look_for in commit range $commit_range
echo

list_of_commits=($(git rev-list $commit_range))
num_of_commits=${#list_of_commits[@]}

look_for_file_in_commit() { git ls-tree -r $1 | grep $filename_to_look_for; }

for c in "${list_of_commits[@]}"
do
  echo Commit $c ":"
  look_for_file_in_commit $c
  echo
done

这是输出的示例:

$ bash lstree.sh
Looking for file SpecRunner.html in commit range 1cb1d..e172

Commit e172774592f13c9fc1bdcd22099e1a104c5d1208 :
100644 blob 33ce97139315d7240ea3d09a5c62f5ea89887cd7    TestPlans/e2e/SpecRunner.html

Commit 14310bc0cf69967d4781e0aec2fd2cca21d72ac6 :
100644 blob 33ce97139315d7240ea3d09a5c62f5ea89887cd7    TestPlans/e2e/SpecRunner.html

Commit 20e22a4b88f36f1f9109680c0bed8b6b28941e9f :
100644 blob 33ce97139315d7240ea3d09a5c62f5ea89887cd7    TestPlans/e2e/SpecRunner.html

Commit fb80ab129f10225117c7a8b25ab51d1e7842e752 :
100644 blob 33ce97139315d7240ea3d09a5c62f5ea89887cd7    TestPlans/e2e/SpecRunner.html

Commit 8d67498dd04ddb1bd27fd110554021d2a7b7c7f1 :
100644 blob 33ce97139315d7240ea3d09a5c62f5ea89887cd7    TestPlans/e2e/SpecRunner.html