【问题标题】:Create a mirror Git repository without transferring objects创建镜像 Git 存储库而不传输对象
【发布时间】:2010-01-24 14:28:11
【问题描述】:

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

我的想法是在每一侧创建一个 Git 存储库,将每一侧的所有文件添加到本地存储库,然后 git-pull 从一个到另一个。我认为 Git 足够聪明,可以知道文件(对象)是相同的,而不是传输它们。但这似乎不是因为仅在一个小样本上,拉取需要很长时间(主要是在“拆包对象”阶段),并且会最大化两者之间的网络连接。所以在我看来,它不必要地传输了 Git 对象。

有没有人知道如何在不实际传输文件的情况下执行此操作?

谢谢!

【问题讨论】:

    标签: git mirroring


    【解决方案1】:

    这很有趣,这可以工作,因为大文件的内容是相同的(我假设)并且应该在两端创建相同的目标文件。

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

    检查并查看您的实际文件的 SHA id 在两个存储库中是否相同。如果是,那么我们需要弄清楚为什么它们可能会被转移,如果不是,那么找出为什么不。

    【讨论】:

    • 是的,它们是相同的。在每一侧添加一个文件后,我在包含该文件的 git 树上执行了 git ls-tree(我认为这是正确的方法),并且两边的 blob 的 SHA id 是 d88cbbbe54e7cd688d399f4e2b4f8195fcf2c4a7。
    【解决方案2】:

    您需要相同的提交。即使树 ID 相同,提交 ID 也可以不同。

    我现在能想到的,如下:

    在一侧进行(初始)提交。注意它的哈希。在.git/objects/ 文件夹中找到哈希。将文件复制到另一台电脑。如果另一台电脑有相同 id 的树,它应该可以工作

    【讨论】:

    • 这似乎有效!但是您还需要编辑 .git/refs/heads/master 文件以包含来自另一方的提交 ID。但目标是最终得到 2 个 repos,其中一个可以作为另一个的镜像(备份)。所以我希望能够在第一方面进行工作并进行更改。因此,如果您随后在第一侧添加另一个文件,然后进行拉取,期望新文件被传输,它会告诉您执行“git reset --hard”。如果你这样做,它似乎确实有效。现在,每次在第一面添加文件并想要从中提取文件时,您都必须执行 'git reset --hard'。
    • git reset --hard 听起来很奇怪。 git 第一次可能想要那个,但每次?你能给我确切的错误信息吗?
    【解决方案3】:

    我使用了sneakernet(好吧,carnet):取一棵本地的下游 git 树,然后将整个内容刻录到 DVD。在远程端,将 DVD 复制到磁盘。然后,如有必要,编辑 .git/config 的 [remote "origin"] 配置部分,以便 repo 仍然可以到达其上游。

    【讨论】:

    • 我会这样做,但另一位主机在该国的另一边。此外,刻录 7 张 DVD,将它们邮寄给那里的人并让他们复制 DVD 至少需要 48 小时,节省不了多少时间。
    【解决方案4】:

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

    Git 是 slow when using the http protocol。如果您唯一的选择是 http 并且您需要 DVCS,您可以尝试Mercurial

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

    【讨论】:

    • 慢是因为我的网络上传速度慢(2Mbps),不是因为Git而且我没有使用HTTP。
    • 在这种情况下,我会看看 Beyond Compare。 Beyond Compare 能够在不实际打开它们的情况下检查两个文件的各种属性(这会破坏目的)以确定它们是否已更改。如果这对您不起作用,我认为 knittl 的答案应该是正确的。不知何故,期望 git 知道恰好具有相同文件结构的两个 repo 是彼此的镜像似乎很简单。我认为它可以工作,但你需要手动调整 Trees、Blob 等。
    猜你喜欢
    • 2015-07-16
    • 2012-08-14
    • 2013-08-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多