我的上游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)
Run Code Online (Sandbox Code Playgroud)
但这就是我得到的:
* xxxxxxx (svn-branch)
|\
| * xxxxxxx (svn-parent-branch)
|
* xxxxxxx (old-svn-branch-head)
Run Code Online (Sandbox Code Playgroud)
如您所见,git svn fetch完全忽略了svn分支被删除的事实,将重新创建的svn提交映射到合并提交git.现在,我不会对此大惊小怪,如果这没有任何后果,但不幸的是,错误的连接会混淆git合并算法,在跨新分支基础提交进行重新定位时会产生虚假的合并冲突.
所以我的问题是:我怎么能诱使git svn fetch不将新的分支基础提交与错误的父级链接,或以某种方式修复我的git repo以保持发布我的东西的能力git svn dcommit?当然,我总是可以再次删除整个事物,并创建一个svn具有不同名称的新分支,但我想知道是否存在更好的解决方案.
我遇到了类似的情况,但仍然找不到关闭此行为的方法(--no-follow-parent关闭整个分支跟踪,这不是我想要的)。
我最终修复了历史git replace --graft。它创建一个替换提交并保持其子项不变。替换后(例如git replace --graft svn-branch svn-parent-branch),您将看到以下内容:
* svn-branch
|
* svn-parent-branch
...
* old-svn-branch-head
Run Code Online (Sandbox Code Playgroud)
您仍然可以使用选项查看原始提交gitk --all。
* svn-branch (replacement)
|
| * svn-branch (original)
|/|
* | svn-parent-branch
| |
| * old-svn-branch-head
...
Run Code Online (Sandbox Code Playgroud)