2

似乎没有一种明显的方法可以同时访问单个 git repo。例如,如果一个用户想要签出提交 A 和另一个提交 B,我能想到的唯一方法就是克隆。

当然,这对于开发来说很好——每个用户都应该有一个克隆——但我无法想象当你使用带有服务器的 repo 并希望允许用户浏览不同的提交时它会很好地工作。您在服务器端需要的克隆数量与用户数量大致相同。

然而 Github 就是这样做的。Github 是如何做到的,或者其他人如何做到这一点,而不使用大量的克隆,最好也没有许多 IO 昂贵的结帐操作?

4

2 回答 2

3

对于浏览提交,您实际上并没有“签出”任何特定文件,您只需根据需要提取对象。这适用于没有--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 包文件格式。 )

于 2013-09-18T18:38:05.053 回答
0

如果您想拥有多个可浏览的源代码树,则无法在工作目录的命令行上执行此操作。

但是您可以调用gitk

$ gitk --all

显示所有分支。然后您可以浏览其中的提交和文件。但是如果你通过 ssh 在服务器上访问它,你也需要隧道 X。

但是,如果您可以安装不是“默认 git”的东西,请查看GitList

于 2013-09-18T18:42:11.210 回答