4

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

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

4

1 回答 1

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 > 远程分支
    git 显示参考 | cut -d " " -f 2 > 本地分支
    git push --delete $(join -v 1 remote-branches local-branches)
    

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

于 2010-11-25T17:06:20.247 回答