gpt4 book ai didi

git - 快速列出大量文件的最后提交日期

转载 作者:IT王子 更新时间:2023-10-29 01:27:54 26 4
gpt4 key购买 nike

我想列出 git 存储库中大量文件的最后提交日期

为了具体起见,让我们假设我想获取特定子目录中所有 *.txt 文件的最后提交日期。存储库中总共有数万个文件,相关的*.txt文件数量在数百个左右。存储库中已经有数千次提交。

我尝试了三种不同的方法。


解决方案 1. This question给出一个答案,基于 git log。但是,如果我尝试做这样的事情,它会很慢:

find . -name '*.txt' |
xargs -n1 git log --format=format:%ai -n1 --all -- '{}'

在我的测试用例中,它花了几分钟——对我的目的来说太慢了。


解决方案 2。像这样的东西会快,不到一秒:

git log --format=format:%ai --name-only .

但是,我将不得不编写一个脚本来对输出进行后处理。此外,上面的命令打印出很多永远不需要的信息:不相关的文件和旧的提交。


解决方案 3. 我也尝试过类似的方法,以摆脱不相关的文件:

git log --format=format:%ai --name-only `find . -name '*.txt'`

但是,结果证明这比解决方案 2 。(运行时间相差 3 倍。)此外,它仍然打印不再需要的旧提交。 p>


问题。我是否遗漏了什么?有没有快捷方便的方法?最好是不仅现在而且将来当我们有更多的提交时都有效的东西?

最佳答案

试试这个。

在 git 中,每个提交都引用一个树对象,它有指向每个文件状态的指针(文件是 blob 对象)。

因此,您要做的是编写一个程序,该程序以您感兴趣的所有文件的列表开始,并从 HEAD 开始。对象(通过 git rev-parse HEAD 获得的 SHA1 提交)。它检查是否有任何“感兴趣的文件”在该树中被修改(树从 git cat-file commit [SHA1] 的“树”属性获得) - 注意,您必须下降到每个目录的子树。如果它们被修改(意味着与它们在“先前”修订版中的不同的 SHA1 哈希),它会从兴趣集中删除每个这样的并打印适当的信息。然后它继续到当前树的每个父节点。这一直持续到兴趣集为空。

如果您想要最快的速度,您将使用 git C API。如果你不想那么那么快,你可以使用git cat-file tree [SHA1 hash] (或者更简单,git ls-tree [SHA1 hash] [files]),这将执行绝对最少的工作量来读取特定的树对象(它是管道层的一部分)。

这在未来会继续发挥多大作用值得怀疑,但如果向前兼容是一个更大的问题,您可以从 git cat-file 提高一个级别- 但正如您已经发现的那样,git log相对较慢,因为它是瓷器的一部分,而不是管道。

参见 here有关 git 的对象模型如何工作的非常好的资源。

关于git - 快速列出大量文件的最后提交日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9417634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com