Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git svn系统中出现意外合并错误?_Git_Svn_Git Svn - Fatal编程技术网

git svn系统中出现意外合并错误?

git svn系统中出现意外合并错误?,git,svn,git-svn,Git,Svn,Git Svn,我有一个有点复杂的设置,如中所示,它看起来像是在Dia中生成的,发布在中-并使用下面的脚本testrepo.sh进行模拟: 基本上,我在web服务器myrepo_SVN_WS上有一个SVN存储库,起初我通过本地PC myrepo_svnco上的一个SVN工作副本使用它。过了一段时间,我停止了,我搬到git svn;但是我没有直接从本地PC使用它,而是在本地服务器上设置了myrepo_gitsvn;在此基础上,在本地服务器myrepo_git_LS.git上创建一个裸git repo,该服务器作为

我有一个有点复杂的设置,如中所示,它看起来像是在Dia中生成的,发布在中-并使用下面的脚本testrepo.sh进行模拟:

基本上,我在web服务器myrepo_SVN_WS上有一个SVN存储库,起初我通过本地PC myrepo_svnco上的一个SVN工作副本使用它。过了一段时间,我停止了,我搬到git svn;但是我没有直接从本地PC使用它,而是在本地服务器上设置了myrepo_gitsvn;在此基础上,在本地服务器myrepo_git_LS.git上创建一个裸git repo,该服务器作为myrepo_gitsvn的远程源添加。这样,我就可以在本地PC上使用myrepo_git_LS.git,并保持本地网络同步工作,即使svn web服务器暂时脱机

下面的脚本在本地模拟了这个过程,包括myrepo_svn_WS离线。如果按原样使用脚本,您会注意到系统可以从SVN WS服务器脱机恢复,这种情况下的日志为。但是,如果您取消注释~commented行,它执行git fetch origingit操作,您将注意到进程失败,其日志为:

远程:使用索引信息重建基本树。。。 远程:返回到修补基础和3路合并。。。 远程:自动合并文件夹/file.txt 远程:冲突内容:在文件夹/file.txt中合并冲突 远程:未能在更改中合并。 远程:修补程序在0001第5 git提交时失败 远程: 远程:解决此问题后,运行git-rebase-continue。 远程:如果您希望跳过此修补程序,请运行git rebase-skip。 远程:要签出原始分支并停止重定基址,请运行git-rebase-abort。 这里让我困惑的是,为什么我会发现这一点出乎意料——我是这里唯一的用户,因此我根本不使用分支!在这种情况下,我怎么可能得到合并冲突

问题是——现在系统实际上已经陷入了这种失败的状态;所以我的问题是:如何将系统恢复到正确的工作状态,这样当我从本地myrepo_git_wc执行提交和推送时,SVN web服务器myrepo_SVN_WS会正确更新

比较日志与meld的几个注意事项:

请注意,在通过git fetch部分模拟合并冲突之后,该过程似乎正常进行-除了现在有一个origingit/master分支单击以获取完整大小:

我对此没有太多考虑,因为我不认为git svn是一个分支;但这里有一个子问题:关于gitsvn和origingit/master,哪一个是分支

这一部分到此结束:

请注意,最后,未失败的进程将日志图树显示为压缩或扁平,即没有分支突出,而此时失败的进程不会抱怨错误,而是将日志图树显示为分支

问题仅在“第6次git提交”后出现:

由于某种原因,失败的进程实际上启动了“应用第5次git提交”,此时应该已经处理了;此时,合并冲突发生

那么,如果我的系统或者更确切地说,myrepo_gitsvn处于这种失败状态,我可以做些什么来恢复它

以下是testrepo.sh代码:

集合x rm-rf/tmp/myrepo* cd/tmp echo模拟svnweb服务器repo svnadmin创建myrepo\u svn\u WS svn公司file:///tmp/myrepo_svn_WS myrepo_svnco read-s-p输入ssh pass[注意,GUI会再次提示您输入相同的内容]:SSHPASS 导出SSHPASS 注意:下一个命令将再次在GUI中提示sshpass一次,而不管sshpass变量是什么 sshpass-e svn公司svn+ssh://localhost/tmp/myrepo_svn_WS myrepo_svnco cd/tmp/myrepo_svnco echo通过svn添加第一次提交 echo aaa>AA.txt svn add AA.txt sshpass-e svn ci-m“第一个svn提交” echo bbb>BB.txt svn add BB.txt sshpass-e svn ci-m“第二次svn提交” echo ccc>CC.txt svn add CC.txt sshpass-e svn ci-m“第三次svn提交” echo ddd>DD.txt svn add DD.txt sshpass-e svn ci-m“第四次svn提交” echo eee>EE.txt svn add EE.txt sshpass-e svn ci-m“第五次svn提交” cd/tmp echo将svn克隆为git sshpass-e git svn克隆svn+ssh://localhost/tmp/myrepo_svn_WS myrepo_gitsvn echo克隆裸git本地服务器 git克隆-裸myrepo_gitsvn myrepo_git_LS.git echo将git本地远程服务器添加到gitsvn cd/tmp/myrepo_gitsvn git远程添加源代码file:///tmp/myrepo_git_LS.git cd/tmp cat>/tmp/myrepo\u git\u LS.git/hooks/post-update>folder/file.txt git add folder/file.txt git提交-第二次git提交 sshpass-egit推送源主机 echo模拟svn服务器离线;添加git-wc提交 mv/tmp/myrepo_svn_WS/tmp/.myrepo_svn_WS echo jjj>>文件夹/file.txt echo jjj>文件夹/file2.txt git添加文件夹/文件*.txt git提交-第三次git提交 sshpass-egit推送源主机 echo KKK>>文件夹/file.txt echo KKK>>文件夹/file2.txt git添加文件夹/文件*.txt git提交-第4次git提交 sshpass- e git推送源主机 echo模拟svn服务器重新联机;添加git-wc提交 mv/tmp/.myrepo_svn_WS/tmp/myrepo_svn_WS ~echo通过git fetch模拟合并冲突 ~cd/tmp/myrepo_gitsvn;git获取原始信息 echo lll>>文件夹/file.txt git add folder/file.txt git提交-第5次git提交 sshpass-egit推送源主机 echo mmm>>文件夹/file.txt git add folder/file.txt git提交-第6次git提交 sshpass-egit推送源主机
所以,我想我有了一些进展——但我真的不确定这是否适用于所有边缘案例,因此最终的更深入的答案将受到赞赏

首先,注意:您可以使用bash testrepo.sh 2>&1 | tee testrepo_MARK.log;您可以从日志中使用:sed-i's/\x1b\[\x4b//g'testrepo*.log

无论如何,显然在执行git fetch时,它添加了一个所谓的本地远程跟踪分支,可以根据删除该分支。要不添加该本地远程跟踪分支,显然应该调用git fetch-prune。 但是,如果从中断状态进行恢复,这还不够;中断状态显然意味着存在一个不成功合并的记录,应该删除该记录,正如程序本身所建议的那样,可以使用git rebase-abort。因此,简单地说,修复方法是:

cd /tmp/myrepo_gitsvn
git branch --delete --remotes origingit/master
git rebase --abort
以下是对上述脚本的修改,允许模拟中断和恢复,只需替换OP脚本中的相应部分:

... cd/tmp cat>/tmp/myrepo\u git\u LS.git/hooks/post-update folder/file.txt git add folder/file.txt git提交-第5次git提交 sshpass-egit推送源主机 echo mmm>>文件夹/file.txt git add folder/file.txt git提交-第6次git提交 sshpass-egit推送源主机 DOFIX=true 如果[${DOCONFLICT}=true];则 如果[${DOFIX}=true];则 https://stackoverflow.com/questions/2003505/delete-a-git-branch-both-locally-and-remotely/2396123123961231 cd/tmp/myrepo_gitsvn; git分支-删除-远程源IT/master; git-rebase-abort; fi fi echo nnn>>文件夹/file.txt git add folder/file.txt git提交-第7次git提交 sshpass-egit推送源主机 echo ooo>>文件夹/file.txt git add folder/file.txt git提交-第8次git提交 sshpass-egit推送源主机 还有一些提交,用于测试恢复是否有效;似乎有效,因为对于最后一次提交,现在可以在日志比较中看到:

…因此,除了轻微的重新排列之外,日志图看起来几乎相同。另外,请注意,正如添加的git svn信息所显示的,每次有一个倒带头在上面重放您的工作,git svn实际上会将存储库提交到commit 5,这是迁移到git svn之前仅在Subversion中完成的最后一个操作;而不是su这就是原因。最后,当压缩日志图在最终提交后显示时,一切看起来都很好:

嗯,我希望这将帮助我修复实际的存储库…

可能相关:以及