gpt4 book ai didi

git - 远程git repo和svn之间无休止的冲突

转载 作者:太空狗 更新时间:2023-10-29 14:39:48 25 4
gpt4 key购买 nike

我对刚刚创建的 git-to-svn 设置束手无策。我已经设置了一个包含两个远程仓库的仓库,一个基于 svn,另一个基于远程 git:

svn-remote.svn.url=https://subversion.acme.com/svn/sales/portal/trunk
svn-remote.svn.fetch=:refs/remotes/git-svn
remote.origin.url=mottinger@git.tkknow.com:/gitroot/acme-gtm-2-0.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

设置好之后,我就可以像这样将提交从 git 存储库移动到 svn 存储库:

git fetch origin
git rebase origin/master (linearizes commits to svn)

git svn rebase
git svn dcommit

一切都很好,直到我决定测试我如何处理冲突。我创建了一个 foo.dat 文件并从 svn 端在其中添加了一行,并在 git 端创建了一个相应的文件,其中一行表示它来自 git。我运行了 git fetch origingit rebase origin/master 来下载 foo.dat 文件。这很好,但是尝试运行 git svn rebase 导致了冲突。完全符合预期,所以我完成了编辑冲突和使用 svn rebase --continue 的步骤。但随后困惑开始了。在尝试运行 git rebase origin/master 以从存储库中提取其他更改后,我在同一个 foo.dat 文件上发生冲突。我已经进入这样一种状态,如果我解决了 svn 的冲突,那么 git 就会失败,反之亦然。最令人沮丧的是,我似乎无法找到一种方法让存储库恢复到恢复这种困惑状态的状态。现在,我有幸能够完全放弃 repos 并再次尝试,但将来随着开发人员使用它,如果我让自己陷入这样的状态,我真的很想知道如何摆脱。非常感谢任何有关正在发生的事情以及如何结束持续 merge 的提示。

谢谢!

最佳答案

这些冲突与git-svn无关。

如果一个人有几个 Remote :remote1 和 remote2,并且这些 Remote 的历史发生了分歧,那么 rebase 操作总是将第一个 Remote 的历史重写到另一个之上。

假设有一个提交 A 被 master 分支引用:

$ git log master
* commit A
Initial commit

还有几个有着不同历史的 Remote :

$ git log remote1/master
* commit R1
Added conflict.txt at remote1
* commit A
Initial commit

$ git log remote2/master
* commit R2
Added conflict.txt at remote2
* commit A
Initial commit

现在将本地历史 rebase 如下:

$ git rebase remote1/master
$ git log master
* commit R1
Added conflict.txt at remote1
* commit A
Initial commit

现在尝试将本地历史 rebase 到 remote2/master 之上,获取冲突并解决它们:

$ git rebase remote2/master
$ git log master
* commit R1
Added conflict.txt at remote1
* commit R2
Added conflict.txt at remote2
* commit A
Initial commit

注意到了吗? Rebase 操作将提交 R1 置于 R2 之上。如您所料,将给定的历史 rebase 到 remote1/master 之上只是交换提交 R1 和 R2 并产生完全相同的冲突。

如何解决?好吧,您必须使两个 Remote 的历史记录相同。最安全的方法是 merge 提交 R1 和 R2,并将生成的 merge 提交推送到 remote1 和 remote2。

现在回到 git-svn。对于您的情况, merge 不同的历史记录将不起作用,因为当您运行 git svn dcommit 时,git-svn 总是重写您的本地历史记录。相反,您必须执行以下操作:

  1. 从 Git 存储库中获取和 rebase 提交:

     $ git fetch origin
    $ git rebase origin/master (linearizes commits to svn)
  2. 将更改发送到 SVN 存储库:

     $ git svn rebase
    $ git svn dcommit
  3. 将从 SVN 获取的提交推送回源:

     $ git push -f origin master:master

第三步非常危险,可能会导致历史遗失。所以,我不建议这样做——git-svn 不支持这样的工作流程。

相反,您可以尝试 SubGit . SubGit 是用于 SVN 和 Git 存储库的双向服务器端镜像工具。

如果您可以在本地访问 Subversion 存储库,则可以将 SubGit 安装到其中:

$ subgit configure $SVN_REPOS
# Adjust $SVN_REPOS/conf/subgit.conf to specify your branches and tags
# Adjust $SVN_REPOS/conf/authors.txt to specify git & svn authors mapping
$ subgit install $SVN_REPOS
...
$ INSTALLATION SUCCESSFUL

因此,您将获得转换后的 Git 存储库,该存储库会自动与原始 SVN 存储库同步。

如果您无法在本地访问 SVN 存储库,您可以考虑使用即将进入早期访问阶段的 SubGit 2.0。 SubGit 2.0 允许在 Git 存储库和远程 SVN 存储库之间设置双向镜像。

SubGit 是一个商业产品。它对开源和学术项目以及最多 10 个提交者的项目免费。

更多详情请引用SubGit documentationgit-svn比较页面。

完全披露:我是 SubGit 开发人员之一。

关于git - 远程git repo和svn之间无休止的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com