GIT SVN:获取没有错误合并父项的重新创建的 SVN 分支

GIT SVN: fetching a recreated SVN branch without the wrong merge parent

我的上游 svn 存储库出现以下情况:

我创建了一个 svn 分支并在其上做了一些工作,这导致了一段非常复杂的历史。所以我再次删除了它,保留了 git 提交,这让我可以很好地清理历史记录。

准备好我的补丁系列后,我使用 svn copy 重新克隆了我的分支,然后是 git svn fetch。我的想法是,然后我会将清理后的历史重新设置为新的 svn 分支,这样我就可以轻松地使用 git svn dcommit.

发布它

然而,git svn fetch 并没有达到我的预期。这是我所期望的(假 git log --oneline --decorate --graph 输出):

* xxxxxxx (svn-branch)
* xxxxxxx (svn-parent-branch)
...
somewhere further down, unrelated to the above
* xxxxxxx (old-svn-branch-head)

但这就是我得到的:

* xxxxxxx (svn-branch)
|\
| * xxxxxxx (svn-parent-branch)
|
* xxxxxxx (old-svn-branch-head)

如您所见,git svn fetch 完全忽略了 svn 分支被删除的事实,将重新创建的 svn 提交映射到 git 中的合并提交。现在,如果这无关紧要,我不会为此大惊小怪,但不幸的是,错误的连接混淆了 git 的合并算法,在跨新分支基础提交进行变基时产生虚假的合并冲突。

所以我的问题是:我怎样才能诱使 git svn fetch 不 link 使用错误的父项提交新的分支基础,或者以某种方式修复我的 git 回购我保留了使用 git svn dcommit 发布我的东西的能力?当然,我总是可以再次删除整个东西,然后用不同的名称创建一个新的 svn 分支,但我想知道是否存在更好的解决方案。

我遇到过类似的情况,还是找不到关闭这个行为的方法(--no-follow-parent关闭整个分支跟踪,这不是我想要的)。

我最终用 git replace --graft. It creates a replacement commit and keeps its children unchanged 修复了历史记录。替换后(例如 git replace --graft svn-branch svn-parent-branch)这是您看到的:

* svn-branch
|
* svn-parent-branch
...
* old-svn-branch-head

您仍然可以看到带有 gitk --all 选项的原始提交。

* svn-branch (replacement)
| 
| * svn-branch (original)
|/|
* |  svn-parent-branch
| |
| * old-svn-branch-head
...