如何将一个git远程仓库镜像到另一个远程仓库并进行推送

7
问题很简单。我使用git cvsimport将一个cvs repo导入到本地git存储库中的远程分支中。然后,我希望将此存储库(分支、标签等)与云端(github / gitorious)中的git存储库同步。为了做到这一点,我没有访问rsync或直接复制存储库的权限,必须使用git push。
如何镜像我的本地存储库,以便其他人可以访问完整的_cvsimport_d历史记录?
具体来说:
我使用cvsimport导入并跟踪存储库:
git cvsimport -i -v -C cdt-make-core -d: pserver:anonymous@dev.eclipse.org:/cvsroot/tools -r cvs org.eclipse.cdt/all/org.eclipse.cdt.make.core 上述命令将org.eclipse.cdt.make.core导入到git repo cdt-make-core的远程cvs中。
然后,我可以将主要CVS分支的HEAD推送到github:
git push github cvs/master:refs/heads/cvs/HEAD
(我明确指定了远程路径,因此如果不存在,则会创建它。)
是否有任何方法可以同步所有分支:cvs/* => cvs/* 在远程上?
是否有任何方法可以同步所有标记?
3个回答

5

我认为您正在寻找--mirror选项进行推送:

git push --mirror github

这将推送所有引用(分支和标签),包括非快进更新。我用它来创建本地仓库的备份。 手册页面这样描述:
代替为每个引用指定名称,指定将 $GIT_DIR/refs/(其中包括但不限于 refs/heads/、refs/remotes/ 和 refs/tags/)下的所有引用镜像到远程仓库。新创建的本地引用将被推送到远程端,本地更新的引用将强制更新到远程端,删除的引用将从远程端移除。如果设置了配置选项 remote..mirror,则默认使用此选项。
[OT: 我在日常工作中使用 CDT,并且很喜欢它!]

谢谢。不幸的是,这似乎不能满足我的需求。看起来这会使云端存储库看起来像是我的,这意味着Github存储库有一个“cvs”远程,但没有可见的cvs分支。我想要的是将remotes/cvs/*的全部内容复制到github的cvs/*中。 - James Blackburn
啊,我现在明白了。很抱歉走到了死胡同。 - Pat Notz

3

我的发现是,如果你使用以下第二个合理的解决方案,你需要先执行--mirror,因为它会清除你尝试推送的那些cvs/分支。因此完整的公式是:

git push --mirror -v github
git push --force github cvs/master:refs/heads/cvs/HEAD
for x in `git branch -r | grep '^..cvs/[a-zA-Z0-9_-]*$' | sed -e 's/^..//'` ; do  
  git push -v github $x:refs/heads/$x
  git config branch.$x.remote github
  git config branch.$x.merge refs/heads/$x
done

1

经过实验,我不认为有任何内置支持我想要做的事情。

然而,似乎有两个合理的解决方案:

  • 不要指定-r到cvsimport。导入的分支将直接存在于存储库中,并且可以像Pat建议的那样使用--mirror
  • 编写一个shell脚本,逐个推送*cvs/**远程(这很简单)。使用--mirror以便正确同步标签

我最初想要保留cvsimport的分支以进行命名空间处理。但是,对于第一个选项,将cvsimport存储库完全分开并仅从中克隆是有意义的。然后,我可以继续跟踪CVS,而不会有弄脏跟踪git repo的风险。


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