似乎没有一种明显的方法可以同时访问单个 git repo。例如,如果一个用户想要签出提交 A 和另一个提交 B,我能想到的唯一方法就是克隆。
当然,这对于开发来说很好——每个用户都应该有一个克隆——但我无法想象当你使用带有服务器的 repo 并希望允许用户浏览不同的提交时它会很好地工作。您在服务器端需要的克隆数量与用户数量大致相同。
然而 Github 就是这样做的。Github 是如何做到的,或者其他人如何做到这一点,而不使用大量的克隆,最好也没有许多 IO 昂贵的结帐操作?
对于浏览提交,您实际上并没有“签出”任何特定文件,您只需根据需要提取对象。这适用于没有--bare
工作目录的存储库(并且几乎所有可以“推送”的存储库)。--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 包文件格式。 )
如果您想拥有多个可浏览的源代码树,则无法在工作目录的命令行上执行此操作。
但是您可以调用gitk
:
$ gitk --all
显示所有分支。然后您可以浏览其中的提交和文件。但是如果你通过 ssh 在服务器上访问它,你也需要隧道 X。
但是,如果您可以安装不是“默认 git”的东西,请查看GitList。