如何使用push将一个git远程镜像到另一个远程镜像

时间:2009-09-08 09:19:30

标签: git cvs git-cvs

问题很简单。我已经使用git cvsimport将cvs repo导入到本地git存储库中的远程分支中。然后,我希望将此存储库:branches,tags和all同步到云中的git存储库(github / gitorious)。要做到这一点,我无法访问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 个答案:

答案 0 :(得分:5)

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

git push --mirror github

这将推送所有引用(分支和标记),包括非快进更新。我使用它来创建本地存储库的备份。

man page描述如下:

  

指定$GIT_DIR/refs/下的所有引用(包括但不限于refs/heads/refs/remotes/refs/tags/),而不是将每个引用命名为push。到远程存储库。新创建的本地引用将被推送到远程端,本地更新的引​​用将在远程端强制更新,并且已删除的引用将从远程端删除。如果设置了配置选项remote.<remote>.mirror,则这是默认值。

[OT:我在日常工作中使用CDT,我喜欢它!]

答案 1 :(得分:3)

我的调查结果是,如果您使用下面的第二个合理解决方案,则需要首先执行 - mirror ,因为它会清除您尝试推送的那些cv /分支。所以完整的公式是:

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

答案 2 :(得分:1)

经过实验,我不相信对我想做的事情有任何内置的支持。

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

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

我原本希望将 cvsimport d分支与命名空间分开。但是,对于第一个选项,保持cvsimport存储库完全独立(并且仅从中克隆)是有意义的。然后,我可以继续跟踪CVS,而不会有跟踪git repo弄脏的风险。