无需检查即可获取历史记录

Getting history without checking out

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

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

有没有办法在最短时间内获取历史记录(甚至是两次修订之间的历史记录)?是否有可能实际上不检查文件(因为我想这就是花费最多时间的事情)。

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

这里的关键字是“shallow clone”。

签出给定的修订本身可能相当长,但这不是克隆存储库时最长的操作,因为在签出给定的修订之前将首先遣返所有对象。

但是,您可能想看一下 git clone--depth--shallow-since 参数,这将允许您只获取分支的提示,直到给定点。

这将让您快速检索给定存储库的最新历史记录,这可能是您最需要的,然后再次使用 git fetch 以在需要时遣返分支的其余部分。

不幸的是,检索唯一的历史本身是不可能的(据我所知),因为这个历史不是"recorded"作为一个整体存在于某种文件中,而是由每个对象的递归引用构成它的父亲。

所以,如果您有权访问(甚至 read-only).git 原始子目录,您可以做的真正肮脏的事情是复制所有文件位于 .git/objects 下,但只有已知为 commit 的那些(您可以用 git cat-file -t 来区分)。事情本身会被破坏,因为树和文件本身在你这样做的时候都不可用,但你仍然可以通过 git remote update 或类似的操作来获取它们。