在我的工作场所,我们使用SVN进行版本控制。当我发现它时,我切换到git-svn,最近我决定将我的一些私有分支同步到另一个远程git仓库。然后,工作流程包括通过git-svn重新定位和推送到SVN仓库,同时处理推送到远程git仓库的单独的私有功能分支,以便我可以在必要时在家中处理它们。
现在,每次我从git-svn转发时,我的远程git repo要求先被拉。有时候,在进行拉取时,更改不会干净地合并,即使据推测,远程仓库应该包含与svn同步的本地提交的相同提交。最近我再次将它们推到远程仓库之前删除远程分支,但这不可能是正确的。
是不是为这种工作流程设置了git,还是我做错了什么?
谢谢!
答案 0 :(得分:6)
首先,感谢Matthew的链接 - 他们帮我解决了这个问题。
可以这样做,但需要注意的是它需要一些小心,并且很可能对涉及的提交者数量有限制。我的用例基本上是mitjak所描述的;需要和/或希望使用两个远程存储库,一个SVN和另一个Git的单个用户。在我的情况下,前者在防火墙后面工作,另一个在异地(也是私人)。目标是能够使用Git处理存储库的本地副本,并使两个远程存储库都满意。
我的程序:
这一切都取决于git svn dcommit
更改与原始git提交相关联的SHA1的事实。牢记这一点,在本地提交后,我[[{1}}然后] git svn rebase
生成最终的SHA1。那时,我推到我的远程git仓库。如果Chacon声明你要做的就是使用git提供更有效的克隆点,那么你就完成了。但您可能也希望能够:
步骤1表示没问题;在将本地“pure git”存储库git svn dcommit
提交到远程git存储库之后。
第2步再次没问题;回到你的混合git / svn存储库,git push
来自远程git存储库的更改。此时,与新提取的修订版关联的SHA1与远程git存储库中的版本保持同步。
第3步是进程变得有点棘手的地方。您可以git pull
如上所述将这些更改推送到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 svn dcommit
应该确认这是远程git存储库中的最后一次提交,它具有与之关联的git-svn-id。然后我做以下事情:
git push -f origin 34b6260:master
执行远程存储库的强制更新,以排除我从“纯git”本地存储库中提取的“纯git”提交 - 小心使用!在这种情况下,我知道我在本地提交了这些提交;他们只是从dcommit有不同的SHA1。然后我git log origin
到远程存储库,添加我刚删除的提交的“git-svn-id” - 转换,并且远程存储库是同步的。
将“纯git”本地存储库与远程git存储库重新同步是最后一步,但类似的关注会产生令人满意的结果。在这种情况下,远程git存储库现在包含提交的“git-svn-id” - 转换,而本地“pure git”存储库仍包含原始SHA1。处理此问题的最简单方法是从远程git存储库git push
,然后git fetch
强制本地git存储库镜像远程状态。
答案 1 :(得分:4)
在chapter 9.1 of Pro Git中,Scott Chacon说:
不要重写您的历史记录并尝试再次推送,也不要推送到并行Git存储库以同时与其他Git开发人员协作。 Subversion只能有一个线性历史记录,而且容易混淆。如果您正在与团队合作,而有些人正在使用SVN而其他人正在使用Git,请确保每个人都使用SVN服务器进行协作 - 这样做会让您的生活更轻松。
基于陈述:
似乎Subversion无法从远程git repo中提取所需的工作流程,因此Subversion只有一个线性历史记录。
您可能需要查看Daya Bay文章同步存储库中的Advanced: Linking another, remote GIT repository to your GIT and GIT-SVN部分。
答案 2 :(得分:0)
也许this thread可能会引起人们的兴趣,尽管git-svn可能已经改变了。
我还使用fetch
而不是pull
,并快速查看在执行合并之前是否会使用gitk
之类的工具发生冲突。