似乎没有一种明显的方法可以并发访问单个 git 存储库。例如,如果一个用户想要 checkout 提交 A 和另一个提交 B,我能想到的唯一方法就是使用克隆。
当然,这对于开发来说很好 - 每个用户都期望有一个克隆 - 但我无法想象当您在服务器上使用存储库时它会很好地工作,并希望允许用户浏览不同的提交。您在服务器端需要的克隆数量大约与用户的数量一样多。
然而 Github 就是这么做的。 Github 是如何做到的,或者其他人是如何做到的,而不使用大量克隆,并且最好也没有许多 IO 昂贵的 checkout 操作?
最佳答案
对于浏览提交,您实际上并不“ checkout ”任何特定文件,您只是根据需要提取对象。这适用于 --bare
存储库,其中没有工作目录(并且“push”可用存储库几乎都是 --bare
)。
要在 shell 中模拟此操作,请尝试:
git ls-tree --name-only HEAD~3
git show HEAD~3:README # assuming README is one of the listed files
如果省略 --name-only
,您将看到指定提交中每个树或 blob 的原始 SHA1 值。树是一个子目录,因此:
git ls-tree HEAD~3 xdiff/
将获取目录xdiff
的内容,等等。 Blob 是一个文件,因此:
git cat-file -p <sha-1>
将为您提供文件的内容(例如具有适当路径的“git show”)。事实上,您也可以使用 git show 来读取目录:
git show HEAD~3:""
很像git ls-tree --name-only HEAD~3
(有一些细微的差别,尝试一下看看)。
(有些树浏览器实际上运行 git 命令,有些使用各种库或其他直接访问原始存储库的方法。使用命令效率不高,但意味着您可以立即适应新格式,例如 v4 包文件格式。)
关于git - 并发和多次提交 git 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18879428/