获取最新提交以触摸git存储库中的每个文件

时间:2015-07-02 19:42:52

标签: git

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

该提交可以添加文件,修改文件,删除文件等。我需要提交哈希,但从提交(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
  3. 第1步需要一段时间(也许是30秒),但我可以忍受,因为它只进行了一次。

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

    我正在寻找一些方法来更有效地做到这一点,可能是通过管道。

    或者,如果有办法加速git日志也可以作为解决方案。

2 个答案:

答案 0 :(得分:0)

" hard"这样做的方法是通过查看日志文件来实际执行repo。这会很快变得混乱,你可能很难得到你想要的东西。

" easy"方法是实际查看git对象。这是一个起点。我们的想法是,您可以通过查看git使用的对象来基本构建此信息。

" hard"方式实际上更容易但更麻烦。 " easy"方式更难,但你可能有更好的机会正确。

希望这有帮助。

答案 1 :(得分:0)

这相当多的要求......在尝试提高效率之前,我先尝试获得想要的输出。

以下是一些可以放在一起创建脚本的指针:

  1. This answer生成跟踪文件列表(git ls-treegit log
  2. This answer获取每个(git log
  3. 的最新提交
  4. git status的某些变体,以获取每个
  5. 的状态
  6. This answer获取包含特定提交(git branch
  7. 的分支
  8. 标准命令行实用程序,可以很好地显示所有爵士乐
  9. 希望有助于实现目标。