git svn rebase错过/失败提交(关于rebase - 继续因合并冲突)?

时间:2015-03-15 00:13:55

标签: git svn git-svn

我遇到了丢失提交的问题,其设置与Unexpected merge error in a git svn system?中描述的设置非常相似(点击查看完整尺寸):

testrepo.png

不幸的是,我无法在一个例子中重现这个问题,所以我会尝试提供我认为相关的信息。我在myrepo_git_wc本地工作,因此它代表了原始来源&#34 ;;目前它具有最后几次提交的状态(所有这些都在" null编辑"在名称中,所以我在那之后贪图):

$ git log --graph --decorate --pretty=oneline --abbrev-commit --all --date-order | grep 'null edit'

* 03ed433 (HEAD, master) : damnit, null edit again
* de3bd53 (origin/master, origin/HEAD) : previous null edit passed
* 65bf738 : again null edit - no improvement
* 62ab3f6 : still bad; trying again w null edit
* 14f5aba : another null edit; previous was bad
* f0ef194 : null edit - starter

我把我的工作推到myrepo_git_LS.git裸露的回购;然后使用post-update挂钩更新myrepo_gitsvn - 最终dcommitmyrepo_svn_WS

所以,目前,myrepo_git_LS.git显示以下内容(使用与上面相同的git log --graph...命令):

* 03ed433 (HEAD, master) : damnit, null edit again
* de3bd53 : previous null edit passed
* 65bf738 : again null edit - no improvement
* 62ab3f6 : still bad; trying again w null edit
* 14f5aba : another null edit; previous was bad
* f0ef194 : null edit - starter

因此,myrepo_git_LS.gitmyrepo_git_wc具有相同的提交,正如预期的那样 - 到目前为止一直很好。

首先,myrepo_gitsvn会针对git log --graph ...

显示此信息
* 964b300 (HEAD, git-svn, master) : null edit - starter

所以myrepo_gitsvn是最早的" null编辑" commit(虽然哈希值不一样);这是myrepo_svn_WS所在的修订版本。我也想在myrepo_gitsvn repo中添加新的提交 - 所以,从myrepo_gitsvn,我这样做:

git pull --rebase origingit master

...应该从myrepo_git_LS.git提交提交内容。现在,myrepo_gitsvn显示了此git log --graph...

* 03ed433 (HEAD, master) : damnit, null edit again
* de3bd53 : previous null edit passed
* 65bf738 : again null edit - no improvement
* 62ab3f6 : still bad; trying again w null edit
| * 964b300 (git-svn) : null edit - starter
...
* | 14f5aba : another null edit; previous was bad
* | f0ef194 : null edit - starter
...

有点奇怪,我在这里得到了最老的" null edit - starter "提交两次;此处还显示了原始提交SHA。此时,图树显示为拆分(即git和SVN提交单独显示)。

所以,我想,如果我在这里git svn rebase(就像我通常在我的工作流程中所做的那样,我之前没有遇到过问题)那么回购将能够& #34;紧凑"这些提交。遗憾的是,--verbose并未在此处详细说明,但这是在myrepo_gitsvn中运行此命令时的输出:

$ git svn rebase
user@ssh.server's password:
First, rewinding head to replay your work on top of it...
Applying: : still bad; trying again w null edit
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging folder/file.tex
CONFLICT (content): Merge conflict in folder/file.tex
Failed to merge in the changes.
Patch failed at 0001 : still bad; trying again w null edit

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

rebase refs/remotes/git-svn: command returned error: 1

因为它说" 失败了;再次尝试w null edit ",这是提交62ab3f6 - 我只是检查文件的那个版本(尽管如果我在文本编辑器中手动编辑文件会发生同样的情况);然后在rebase--continue myrepo_gitsvn询问:

$ git checkout 62ab3f6 folder/file.tex 
$ git add folder/file.tex
$ git rebase --continue
Applying: : still bad; trying again w null edit
Applying: : again null edit - no improvement
Applying: : previous null edit passed
Applying: : damnit, null edit again

它几乎看起来不错;但如果我现在在git log --graph ...中执行myrepo_gitsvn命令,我会得到:

* eef9e50 (HEAD, master) : damnit, null edit again
* 9b2af2d : previous null edit passed
* 380b0f9 : again null edit - no improvement
* a41db2b : still bad; trying again w null edit
* 964b300 (git-svn) : null edit - starter

如果你比较原始状态 - 除了提交SHA哈希不相同之外,还有另一个问题:提交" 另一个空编辑;以前很糟糕" (应该介于" null edit - starter "" 仍然不好;再次尝试w null edit ")是不再存在?!!基本上,我现在可以git svn dcommit这个状态 - 它会毫无错误地上传到SVN服务器;但是我失去了一个提交 - 这可能会在以后的变基中引起问题!

因此,此时我通过重置这样删除myrepo_gitsvn中的最新提交:

git reset --hard 964b300
git svn reset -r446
git svn rebase

...这导致了这个帖子开始的状态(所以我可以无限期地循环这个过程)。

我的问题是 - 我能做什么,所以最初出现在git方面的所有提交都被svn方面识别和整合;或换句话说,我如何强制git svn同时获取此丢失/丢失的提交?

1 个答案:

答案 0 :(得分:0)

只是几个笔记;看起来,这与两次出现的“ null edit - starter ”提交有关。我在分割树图中看到它的方式:

  • | *表示git-svn提交,即带有“SVN”SHA哈希的提交
  • 顶部的*表示“普通git”提交,只有一个git SHA哈希
  • * |表示使用git SHA哈希提交 - 但显然已存在于SVN中的提交!

这意味着,* | 14f5aba : another null edit; previous was bad意味着某种程度上,git-svn得到了这个 在SVN中存在的信息 - 然而这是转447,“ null编辑 - 启动器“是rev 446 - SVN的负责人是446。

但是 - 它是446,因为在之前的尝试中,我试图Manually deleting only the latest revision from online SVN repository? - 显然,在SVN树中有一个447 的状态,所以git-svn以某种方式记录下来。

此时,我试图先Remove specific commit - 14f5aba,但这不起作用;显然,git和SVN提交之间的这种绑定被记录在其他地方。所以我做的是“伪造”在SVN上提交修订版447(因为我已经拥有相同修订版的源代码git,我可以执行相同的修补程序,以及相同的提交消息,结果使用相同的git哈希) - 和这允许最终在下一个rebase上找到提交。但是后来我在同一个回购中遇到了其他麻烦...所以,最终我不确定这是否就是它的全部......