获取历史而不检出

时间:2019-05-10 12:57:30

标签: git libgit2

对于一个项目,我需要知道两个修订之间的所有提交。

通常,只需克隆存储库并检查历史记录即可。我不需要文件实际存在于文件系统中,我只对历史本身感兴趣。
由于大型存储库的性质,克隆它们可能需要一些时间。

是否有一种方法可以在最短的时间内获取历史记录(甚至两个修订之间的历史记录)?是否有可能实际上不检出文件(因为我猜这就是最耗时的时间)。

2 个答案:

答案 0 :(得分:4)

使用--bare进行克隆操作,您将拥有一个git repo,其中没有工作树(实际文件),但可以检查整个历史记录。

答案 1 :(得分:4)

此处的关键字是“ 浅克隆”。

签出给定的修订本本身可能会很长,但这并不是克隆存储库时最长的操作,因为在签出给定的修订本之前,所有对象都将首先被送回。

但是,您可能希望查看--depth的{​​{1}}和--shallow-since参数,这将允许您仅获取分支的尖端直到给定点

这将使您快速检索给定存储库的最新历史记录,这可能是您最需要的,然后再次使用git clone来归还分支的其余部分。

不幸的是,据我所知,本身不可能检索唯一的历史记录,因为该历史记录不是整体记录在某种文件中,而是由每个对象对其父对象的递归引用构成的。

因此,如果可以访问git fetch原始子目录(甚至是只读的),则确实会做的事情是复制位于.git下的所有文件但是只有已知的.git/objects(您可以使用commit来告知)。事情本身会被破坏,因为在您执行操作时,树和文件本身都将不可用,但是您仍然可以使用git cat-file -t或类似操作来获取它们。