如果您的git版本太旧而无法从您的gitolite服务器支持git push --mirror
,则可以先通过git clone --bare
新存储库然后在备份服务器上使用git fetch refs/*:refs/*
来模拟该功能?你能指定*:*
作为refspec吗?由于gitolite服务器上的存储库是裸存储库,因此fetch命令不能设法获取仅在您有工作目录时使用的对象并不重要。
我的恢复策略是希望将备份服务器的$ BACKUPDIR的内容复制到新的gitolite服务器(如果当前的一个爆炸)。在这种情况下,这也会按预期工作吗?
答案 0 :(得分:3)
如果没有安装旧版本的git并检查解决方案是否真的适用于此版本,这个问题有点难以回答。 (不管怎么说,我不知道你感兴趣的是哪个版本。)那就是说,我会尝试提供一些关于尝试的提示,你可以自己检查它是否适合你。
当您真的要模拟git fetch
时,我认为没有理由使用git push
代替git push --mirror
。
您可以使用*:*
作为refspec(至少在最新版本的git中)。这与:
不同,因为后者仅选择存储在两个存储库中的分支,而前者选择发送站点上的所有分支并将它们发送到接收站点,必要时在那里创建新分支(这包含适用于fetch
和push
)。
单个命令中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
使用制表符表示相同类型的输出。)