【问题标题】:Get latest commit to touch every file ever in a git repository获取最新提交以触及 git 存储库中的每个文件
【发布时间】:2015-09-20 11:57:59
【问题描述】:

我想找到最后一次提交,该提交触及了曾经存在于一组分支上的每个文件。也就是说,对于曾经存在于一个或多个指定分支上的每个文件,给我最后一次提交。

该提交可能已经添加了文件、修改了文件、删除了文件等。我需要提交哈希,但最好从提交中生成文件状态(A、M、D 等),到达它的分支集和使用相同命令的提交日期,因此我不必运行更多命令来生成它。我怀疑我是否可以一次获得所有这些信息,但这是我需要的最终信息集。

我知道如何获取存储库中的文件列表,但不知道如何将其减少到曾经存在于一组分支上的文件集。即使我生成了一个文件列表,生成它然后返回并为每个文件做一个 git 日志似乎效率低下。有没有办法一次性完成并至少获取每个此类文件的最新提交哈希。

我已经尝试过这个基本算法:

  1. 通过 git log --all --diff-filter=A --pretty=format: --name-only --date-order 收集所有文件
  2. 对于每个文件,运行 git log -n1 --date-order --all --pretty=format:%H -- file

第 1 步需要一段时间(可能需要 30 秒),但我可以忍受,因为它只完成了一次。

第 2 步每次调用 git log 需要 3-4 秒,这在处理数千个文件时太慢了。

我正在寻找更有效的方法,可能是通过管道。

或者,如果有一种方法可以加快 git log 的速度,这也是一种解决方案。

【问题讨论】:

    标签: git


    【解决方案1】:

    执行此操作的“硬”方法是通过查看日志文件来实际遍历 repo。这会很快变得一团糟,你可能很难得到你想要的。

    “简单”的方法是实际查看 git 对象。这是一个起点。这个想法是,您基本上可以通过查看 git 使用的对象来构建这些信息。

    “硬”方法实际上更容易但更麻烦。 “简单”的方法更难,但你可能有更好的机会做对。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      这是一大堆要求……在考虑效率之前,我会先尝试获得想要的输出。

      这里有一些指针可以放在一起创建一个脚本:

      1. This answer 生成跟踪文件列表(git ls-treegit log
      2. This answer 获取每个最近的提交 (git log)
      3. git status 的一些变体以获取每个变量的状态
      4. This answer 获取包含某个提交的分支 (git branch)
      5. 标准命令行实用程序可以很好地显示所有爵士乐

      希望这有助于您实现目标。

      【讨论】:

      • 这基本上是我已经做过的,但是速度很慢。 git log 位占主导地位。因此效率问题。
      • 啊,我明白了,也许在你的 Q 中提到你已经尝试过这个(SO 非常热衷于人们在询问之前表明他们尝试过)并重新制定你的 Q 以专门询问效率
      • 仅在 1 个分支上也很慢吗?如果没有,那么您可以将这些步骤用于 1 个分支并为您想要的分支整体运行并行作业?
      • 我已经编辑了这个问题以表明一个尝试过的基本算法。谢谢指点!仅在一个分支上也很慢。如果我不使用 -- 文件名,它几乎是瞬间完成的,但这当然不能满足我的要求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 2017-07-12
      • 2022-01-10
      相关资源
      最近更新 更多