我遇到了丢失提交的问题,其设置与Unexpected merge error in a git svn system?中描述的设置非常相似(点击查看完整尺寸):
不幸的是,我无法在一个例子中重现这个问题,所以我会尝试提供我认为相关的信息。我在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
- 最终dcommit
到myrepo_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.git
与myrepo_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
同时获取此丢失/丢失的提交?
答案 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上找到提交。但是后来我在同一个回购中遇到了其他麻烦...所以,最终我不确定这是否就是它的全部......