git-svn和一个远程git repo同步

dmk*_*mkc 11 svn git workflow git-svn

在我的工作场所,我们使用SVN进行版本控制.当我发现它时,我切换到git-svn,最近我决定将我的一些私有分支同步到另一个远程git仓库.然后,工作流包括通过git-svn重新定位和推送到SVN仓库,同时处理推送到远程git仓库的单独的私有功能分支,以便我可以在家中处理它们(如有必要).

现在,每次我从git-svn转发时,我的远程git repo要求先被拉.有时候,在进行拉取时,更改不会干净地合并,即使据说远程仓库应该包含与svn同步的本地提交相同的提交.最近我再次将它们推到远程仓库之前删除远程分支,但这不可能是正确的.

是不是没有为这种工作流程设置git,或者我做错了什么?

谢谢!

jst*_*nco 7

首先,感谢Matthew的链接 - 他们帮我解决了这个问题.

这样做是可能的,但需要注意的是它需要一些小心,并且很可能在涉及的提交者数量方面存在限制.我的用例基本上是mitjak所描述的; 需要和/或希望使用两个远程存储库,一个SVN和另一个Git的单个用户.在我的情况下,前者在防火墙后面工作,另一个在异地(也是私人).目标是能够使用Git处理存储库的本地副本,并使两个远程存储库都满意.

我的程序:

这一切都取决于git svn dcommit更改与原始git提交相关的SHA1的事实.牢记这一点,在本地提交之后,我[可选地git svn rebase]然后git svn dcommit生成最终的SHA1.那时,我推到我的远程git仓库.如果Chacon声明你要做的就是使用git提供更有效的克隆点,那么你就完成了.但您可能也希望能够:

  1. 从另一个本地"纯git"存储库推送到远程git存储库,然后是
  2. 同步混合git/svn存储库,然后
  3. 将这些更改推送到SVN存储库.

第1步没有问题; 在将本地"pure git"存储库提交git push到远程git存储库之后.

第2步再次没问题; 回到你的混合git/svn存储库,git pull来自远程git存储库的更改.此时,与新拉出的修订版关联的SHA1与远程git存储库中的版本保持同步.

第3步是进程变得有点棘手的地方.git svn dcommit如上所述,您可以将这些更改推送到SVN存储库,但是情况与上述情况略有不同.在这种情况下,您现在在远程SVN和git存储库中具有相同的修订版,但由于dcommit,它们具有不同的SHA1.我通过以下方式处理:

在第2步的拉动期间,我注意到相关的开始SHA1; 例如,

  git pull
  someone@example.org's password: 
  remote: Counting objects: 5, done.
  remote: Compressing objects: 100% (3/3), done.
  remote: Total 3 (delta 0), reused 0 (delta 0)
  Unpacking objects: 100% (3/3), done.
  From ssh://example.org/pub/scm/demonstrate
    34b6260..17cd887  master     -> origin/master
  Updating 34b6260..17cd887
  Fast forward
    file3 |    2 +-
    1 files changed, 1 insertions(+), 1 deletions(-)

所以这里感兴趣的SHA1是34b6260. git log origin应该确认这是远程git存储库中的最后一次提交,它具有与之关联的git-svn-id.然后我做以下事情:

git push -f origin 34b6260:master

执行远程存储库的强制更新,以排除我从"纯git"本地存储库中提出的"纯git"提交 - 小心使用!在这种情况下,我知道我在本地提交了这些提交; 他们只是从dcommit有不同的SHA1.然后我git push到远程存储库,添加我刚刚删除的提交的"git-svn-id" - 转换,并且远程存储库是同步的.

将"纯git"本地存储库与远程git存储库重新同步是最后一步,但类似的护理会产生令人满意的结果.在这种情况下,远程git存储库现在包含提交的"git-svn-id" - 转换,而本地"pure git"存储库仍包含原始SHA1.处理此问题的最简单方法是git fetch从远程git存储库,然后git reset --hard origin强制本地git存储库镜像远程状态.


Mat*_*kin 5

Pro Git的 9.1章中,Scott Chacon指出:

不要重写您的历史记录并尝试再次推送,也不要推送到并行的Git存储库与其他Git开发人员同时进行协作。Subversion只能有一个线性历史记录,而且很容易混淆。如果您正在与团队合作,并且有些人正在使用SVN,而另一些人正在使用Git,请确保每个人都在使用SVN服务器进行协作-这样会使您的生活更轻松。

根据声明:

  1. “不要推送到并行的Git存储库”,并且
  2. “ Subversion只能有一个线性历史记录”,

看来Subversion不能从远程git repo中提取信息就无法处理所需的工作流程,因此Subversion只有一个线性历史记录。

更新10年9月1日下午8:37

您可能想查看“ 通过Daya Bay 同步存储库 ”一文中的“ 高级:将另一个远程GIT存储库链接到您的GIT和GIT-SVN ”部分。