不转移对象创建Git镜像仓库

4
我有一组大量的文件(50GB),它们在两个远距离的主机上,并且我想将它们放入几个Git存储库中,以便每个存储库都是另一侧存储库的镜像。但是我不想通过网络传输文件,因为这需要很长时间(50-60小时),而且这是不必要的,因为文件已经在两侧。

我的想法是在每一侧创建一个Git存储库,将每一侧的所有文件添加到本地存储库中,然后从一个存储库git-pull到另一个存储库。我认为Git会聪明到知道文件(对象)是相同的,不会传输它们。但是它似乎并不是这样,因为在一个小样本上,执行pull需要很长时间(主要在“Unpacking objects”阶段),并且它使两者之间的网络连接达到最大值。因此,我认为它正在不必要地传输Git对象。

有没有人有关于如何在不实际传输文件的情况下完成此操作的想法?
谢谢!
4个回答

1

很有趣,因为大文件的内容相同(我假设),应该在两端创建相同的对象文件。

在我的本地机器上对两个存储库进行测试表明,不同存储库中的相同文件将具有相同的SHA ID。

检查并查看实际文件的SHA ID是否在两个存储库中相同。如果是,则需要弄清楚为什么它们可能会被传输,如果不是,则找出原因。


是的,它们完全一样。在每个侧面添加文件后,我在包含该文件的 git 树上执行了 git ls-tree 命令(我认为这是正确的方法),对于两侧的 blob,SHA id 都是 d88cbbbe54e7cd688d399f4e2b4f8195fcf2c4a7。 - user257836

1

你需要提交记录是相同的,即使树的ID相同,提交ID也可能不同。

我现在能想到的方法如下:

在一侧进行(初始)提交。记下其哈希值。在.git/objects/文件夹中查找哈希值。将文件复制到另一台计算机上。如果另一台计算机具有相同ID的树,则应该可以工作。


这似乎有效!但您还需要编辑.git/refs/heads/master文件,以包含来自另一侧的提交ID。但目标是最终拥有两个仓库,其中一个可以是另一个的镜像(备份)。因此,我希望能够在第一侧进行工作并进行更改。因此,如果您在第一侧添加另一个文件,然后执行拉取操作,期望传输新文件,则会提示您执行“git reset --hard”。如果您这样做,它似乎有效。现在,每次您在第一侧添加文件并想要从中拉取时,都必须执行“git reset --hard”。 - user257836
“git reset --hard” 听起来很奇怪。Git可能在第一次需要这样,但每一次都要吗?你能给我精确的错误信息吗? - knittl

0

我使用了 sneakernet(也就是“步行网络”):将本地的一个下游 git 树全部刻录到 DVD 上。在远程端,将 DVD 复制到磁盘上。然后,如果需要,编辑 .git/config 的 [remote "origin"] 配置部分,以便该仓库仍然可以访问其上游。


我本来想这么做,但是另一个主机在国家的另一边。此外,烧录7张DVD,邮寄到那里的某个人并让他们复制DVD至少需要48小时,这并不是一个省时的方法。 - user257836

0

你使用的是什么协议,Git 还是 Http?

当使用 Http 协议时,Git 会变得很慢。如果你唯一的选择是 Http 并且你需要一个分布式版本控制系统,你可以尝试 Mercurial

如果你只需要同步两个远程文件夹,你可以看看 Beyond Compare


它很慢是因为我的网络上传速度很慢(2Mbps),而不是因为Git,我也没有使用HTTP。 - user257836
在这种情况下,我会看看Beyond Compare。 Beyond Compare能够检查两个文件的各种属性,而不必打开它们(这将违反其目的),以确定它们是否更改。如果这对你没有用,我认为knittl的答案应该是正确的。某种程度上,期望git知道两个仓库,它们碰巧具有相同的文件结构,是彼此的镜像似乎太简单了。我想它可以工作,但你需要手动调整树、块等。 - Lieven Keersmaekers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接