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
...
我的上游 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
...