使用fetch而不是push来备份git存储库

时间:2010-11-25 08:28:52

标签: git gitolite

如果您的git版本太旧而无法从您的gitolite服务器支持git push --mirror,则可以先通过git clone --bare新存储库然后在备份服务器上使用git fetch refs/*:refs/*来模拟该功能?你能指定*:*作为refspec吗?由于gitolite服务器上的存储库是裸存储库,因此fetch命令不能设法获取仅在您有工作目录时使用的对象并不重要。

我的恢复策略是希望将备份服务器的$ BACKUPDIR的内容复制到新的gitolite服务器(如果当前的一个爆炸)。在这种情况下,这也会按预期工作吗?

1 个答案:

答案 0 :(得分:3)

如果没有安装旧版本的git并检查解决方案是否真的适用于此版本,这个问题有点难以回答。 (不管怎么说,我不知道你感兴趣的是哪个版本。)那就是说,我会尝试提供一些关于尝试的提示,你可以自己检查它是否适合你。

  1. 当您真的要模拟git fetch时,我认为没有理由使用git push代替git push --mirror

  2. 可以使用*:*作为refspec(至少在最新版本的git中)。这与:不同,因为后者仅选择存储在两个存储库中的分支,而前者选择发送站点上的所有分支并将它们发送到接收站点,必要时在那里创建新分支(这包含适用于fetchpush)。

  3. 单个命令中git push --mirror $REMOTE的最接近的近似值可能是

    git push -f $REMOTE *:*
    

    与“真实的东西”的区别在于它永远不会删除远端的分支。你可以忽略这一点 - 无论如何它可能是非常合理的备份 - 或者你可以破解一些代码来手动删除它们。这是我(非常糟糕)的尝试:

    git ls-remote $REMOTE refs/* | cut -f 2 > remote-branches
    git show-ref | cut -d " " -f 2 > local-branches
    git push --delete $(join -v 1 remote-branches local-branches)
    

    我确实认为这种尝试存在根本缺陷 - 使用风险自负。无论如何,它可能不适用于旧版本的git。 (我很惊讶git show-ref使用空格作为字段分隔符,而git ls-remote使用制表符表示相同类型的输出。)