2

您如何在不知道文件名的情况下(可能)也被删除的文件中搜索特定的代码行?

更具体地说,一个月前我正在编写一个脚本并让它满足我们的需求,但是发生了一个相当特殊的情况。我们确信过去存在一个包含 line/word 的文件x-shared-component。当前存储库中似乎不再存在此行。我们不确定该行是否在过去被删除,或者文件(名称也不知道)是否刚刚被删除。

我试过了:

  • 如果任何文件包含该行,则查看当前 HEADgit grep -i "x-shared-components"
  • git log -p --all | grep -i "x-shared-components"
  • git grep -i "x-shared-components" $(git rev-list --all)

有什么我没有考虑到的东西吗?我试图删除一个文件并搜索它的内容,git log -p --all | grep -i <regex>我能够找到行。如果我似乎找不到任何结果,这是否意味着当前 git 存储库中实际上从未存在过这样的行?

4

3 回答 3

2

有问题的行(可能还有整个文件)可能在合并期间被删除。

不幸的是git log -p,包括带有自动差异搜索(-S-G)的变体,通常根本不考虑合并差异

幸运的是,通过 git log -p添加-m. 您甚至可以使用-m --first-parent(跳过剩余的父母会更快)。我建议:

git log -m -S x-shared-component

在这里,因为您不需要正则表达式,并且在相关合并中出现的次数会发生变化。

请注意,最近有一些关于 Git 的工作来改进合并提交的差异;此-m方法适用于所有版本的 Git,而不仅仅是最近的版本。

于 2021-08-11T19:02:13.607 回答
2

您正在寻找git log -Ggit log -S

git log --name-status -G x-shared-component
git log --name-status -S x-shared-component
于 2021-08-11T11:26:28.827 回答
0

它可能会很慢,但是您应该能够在 repo 中找到所有 blob,例如:

git rev-list HEAD | xargs -n 1 git ls-tree -r | 
    while read a b h path; do 
        git show "$h" | grep -q x-shared-component && echo $h; 
    done

获得 blob 后,您可以使用git show.

稍加思考,您几乎可以肯定将工作量减少 95%。当然不要在同一个 blob 上多次运行 grep,例如:

git rev-list HEAD | xargs -n 1 git ls-tree -r | awk '{print $3}' | sort -u | 
    while read  h ; do git show "$h" | grep -q x-shared-component && echo $h; done
于 2021-08-11T12:04:12.267 回答