【问题标题】:Find the git commit where directory was first created找到第一次创建目录的 git commit
【发布时间】:2018-07-23 09:33:54
【问题描述】:

works for file 不适用于目录的解决方案。我怎么知道第一次创建目录的第一个 git commit?

编辑:正如其中一条评论指出的那样,只有当该目录下的文件被添加到版本控制中时,该目录才会出现在 git 中。在这个问题的上下文中,我不知道该目录下的哪个文件是先添加的。

【问题讨论】:

  • 如果我错了,请纠正我,但我相信目录的记录方式与文件不同,例如因为您需要在新目录中有一个文件才能添加它。所以我认为你需要找出目录中的第一个文件是什么时候提交的。
  • 我澄清了你的疑问。

标签: git


【解决方案1】:

我知道在大量提交中快速检查路径的最佳方法是使用git cat-file --batch-check。反向列出您的提交,即最旧的第一个与您感兴趣的路径并将其提供给批处理检查器,如果路径丢失,它会抱怨但它会向标准输出这样做,因此您可以打印第一行而没有投诉:

git log --reverse --pretty=$'%H:path/to/folder\t%H' \
| git cat-file --batch-check='%(rest)' \
| awk 'NF==1 { print;exit; }'

【讨论】:

    【解决方案2】:

    您可以使用git bisect 来查找某些内容何时以某种方式发生了变化。它假设存储库过去是正确的,但最近发生了一些事情使其不正确。

    对于本例,“good”是存在的目录,而“bad”是存在的目录。

    首先,您会找到一个“错误”的提交:

    $ ls -d MyDirectory
    MyDirectory/
    $ git bisect start
    $ git bisect bad
    

    然后你会找到一个“好”的提交

    $ git checkout HEAD~1000
    $ ls -d MyDirectory
    ls: cannot access 'MyDirectory': No such file or directory
    $ git bisect good
    

    那你要么反复手动bisect good/bad

    $ if [ -d MyDirectory ]; then git bisect bad; else git bisect good; fi
    

    或者你使用bisect run:

    $ git bisect run [ ! -d MyDirectory ]
    

    最后它会告诉你第一个“坏”的提交。

    【讨论】:

      【解决方案3】:

      一种可能的方法是,对于文件夹中的所有文件,检查when that file was added

      git log --diff-filter=A -- foo.js
      

      但简单地使用log for that folder 也有帮助:

      git log -- path/to/folder
      

      【讨论】:

      • 发现这很有帮助,如果能够专门引用 dir 创建会很好,但也足够好了 - 有点边缘情况,有人只添加了一个空文件夹e
      【解决方案4】:

      基于@VonC 的回答,使用--reverse 和一些awkward post-processing(遗憾的是,--reverse 应用于日志之后 -n 1),我们得到:

      git log -- path/to/folder | awk 'NR>1 {print last} {last=$0}; /^commit/ && ++c==2{exit}'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-06
        • 2017-04-11
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多