【问题标题】:Find deleted line in deleted file Git在已删除的文件 Git 中查找已删除的行
【发布时间】:2021-10-14 18:54:03
【问题描述】:

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

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

我试过了:

  • 如果有任何文件包含带有git grep -i "x-shared-components" 的行,则查看当前 HEAD
  • 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 存储库中实际上从未存在过这样的行?

【问题讨论】:

  • 一个笨拙但简单有效的方法:git bisect 以及简单的全局文本搜索。

标签: git grep git-log git-rev-list


【解决方案1】:

有问题的行(可能还有整个文件)可能在合并过程中被删除了。

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

幸运的是,通过添加-m,很容易制作 git log -p 查看合并差异。你甚至可以使用-m --first-parent(跳过剩下的父母会更快)。我推荐:

git log -m -S x-shared-component

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

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

【讨论】:

    【解决方案2】:

    它可能会很慢,但你应该能够找到 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
    

    【讨论】:

      【解决方案3】:

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

      git log --name-status -G x-shared-component
      git log --name-status -S x-shared-component
      

      【讨论】:

      • 重新阅读您的问题:这个答案可能会有所帮助,但不能解决您的问题(目前)
      • 感谢您的输入,很遗憾没有结果。考虑到搜索此类事件的所有可能方法,我们开始认为我们正在寻找的这个资源可能永远不会存在于存储库中。因为我试图模拟类似的东西并能够追踪它,但不能使用那个 x-shared-component。仍然感谢您的努力!
      猜你喜欢
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 2020-01-04
      • 2022-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      相关资源
      最近更新 更多