Hal*_*alt 5 svn version-control svn-merge mergeinfo svn-merge-reintegrate
新的1.8 subversion客户端有问题(我们使用TortoiseSVN 1.8.5和SlikSVN 1.8.5).似乎在重新集成后能够继续使用您的功能分支的新SVN 1.8功能在某些情况下不起作用.
当trunk包含本地mergeinfo(文件或子树上的Mergeinfo)时,它不起作用.这可能会导致重新集成后分支重用的问题.如果使用'keep alive dance'(使用仅记录选项)完成分支重用,这对1.7客户端来说不是问题.
我已经制作了一个从头开始说明这个问题的脚本.它可以使用1.8客户端针对空存储库运行.
下面的脚本有10个步骤.步骤1-5用于创建在主干中具有本地mergeinfo的起始情况.步骤6-9模拟在功能分支2的生命周期内对主干进行的更改.步骤10是失败的步骤,它模拟重新集成后重用特征分支的第一步.
这是步骤10中的错误:
svn: E195016: Reintegrate can only be used if revisions 8 through 11 were pre
viously merged from svn://svn2010/practice/branches/featurebranch2 to the reinte
grate source, but this is not the case:
trunk/file1.txt
Missing ranges: /trunk/file1.txt:9
Run Code Online (Sandbox Code Playgroud)
这是(Windows)脚本.
@ECHO OFF
ECHO ------------------------------------------------------------------
ECHO STEP 0: Create a repository
ECHO ------------------------------------------------------------------
if exist repo rmdir repo /S/Q
if exist trunk rmdir trunk /S/Q
if exist featurebranch1 rmdir featurebranch1 /S/Q
if exist featurebranch2 rmdir featurebranch2 /S/Q
svnadmin create repo --compatible-version 1.8
REM Make url based on current directory and replace backslashes by forward slashes
set url="file:///%cd:\=/%/repo"
ECHO url=%url%
ECHO ------------------------------------------------------------------
ECHO STEP 1: Create a trunk with 2 files
ECHO ------------------------------------------------------------------
svn mkdir -m "Create trunk" %url%/trunk
svn checkout %url%/trunk
echo Original file contents created in the trunk. > trunk\file1.txt
echo Original file contents created in the trunk. > trunk\file2.txt
svn add trunk\file1.txt
svn add trunk\file2.txt
svn -m "Added 2 files" commit trunk
ECHO ------------------------------------------------------------------
ECHO STEP 2: Create a copy (feature branch) from the trunk
ECHO ------------------------------------------------------------------
svn mkdir -m "Create branches dir" %url%/branches
svn copy -m "Create featurebranch1" %url%/trunk %url%/branches/featurebranch1
ECHO ------------------------------------------------------------------
ECHO STEP 3: Modify both files in the feature branch
ECHO ------------------------------------------------------------------
svn checkout %url%/branches/featurebranch1
echo Additional file contents created in featurebranch1. >> featurebranch1\file1.txt
echo Additional file contents created in featurebranch1. >> featurebranch1\file2.txt
svn -m "Modified 2 files in featurebranch1" commit featurebranch1
ECHO ------------------------------------------------------------------
ECHO STEP 4: Merge both files from featurebranch1 to the trunk to
ECHO create local mergeinfo on both files
ECHO ------------------------------------------------------------------
svn update trunk
svn merge %url%/branches/featurebranch1/file1.txt trunk/file1.txt
svn merge %url%/branches/featurebranch1/file2.txt trunk/file2.txt
svn -m "Merged 2 files from featurebranch1 to trunk" commit trunk
ECHO ------------------------------------------------------------------
ECHO STEP 5: Delete featurebranch2, we only needed it for the
ECHO initial setup
ECHO ------------------------------------------------------------------
svn delete -m "Delete featurebranch1" %url%/branches/featurebranch1
ECHO ------------------------------------------------------------------
ECHO STEP 6: This is the start of the problematic scenario
ECHO Create a new featurebranch2 from the trunk and a wc for it
ECHO ------------------------------------------------------------------
svn copy -m "Create featurebranch2" %url%/trunk %url%/branches/featurebranch2
svn checkout %url%/branches/featurebranch2
ECHO ------------------------------------------------------------------
ECHO STEP 7: Modify the contents of file1.txt in the trunk and leave
ECHO the contents of file2.txt unchanged (this is important)
ECHO ------------------------------------------------------------------
echo Additional file contents created in the trunk. >> trunk\file1.txt
svn -m "Modified file1.txt in the trunk" commit trunk
ECHO ------------------------------------------------------------------
ECHO STEP 8: Sync merge the trunk to featurebranch2
ECHO ------------------------------------------------------------------
svn update featurebranch2
svn merge %url%/trunk featurebranch2
svn -m "Sync merged the trunk into featurebranch2" commit featurebranch2
ECHO ------------------------------------------------------------------
ECHO STEP 9: Reintegrate featurebranch2 back into the trunk
ECHO ------------------------------------------------------------------
svn update trunk
svn merge %url%/branches/featurebranch2 trunk
svn -m "Reintegrated featurebranch2 back into the trunk" commit trunk
ECHO ------------------------------------------------------------------
ECHO STEP 10: Try to reuse featurebranch2 after it was reintegrated
ECHO Sync merge it from the trunk. THIS FAILS with SVN 1.8
ECHO ------------------------------------------------------------------
svn update featurebranch2
REM on SVN 1.7 we would use --record-only
svn merge %url%/trunk featurebranch2
:EOF
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样.此错误报告缺少file1.txt的范围,而它似乎是缺少mergeinfo的file2.txt.虽然不是解决方案,但删除trunk中file2.txt上的本地mergeinfo似乎也解决了这个问题.这也暗示错误消息正在报告错误文件上的内容.
编辑:对@gbjbaanb的响应即使错误消息相同,此问题也比您指向的问题更微妙.在我的情况下,不是重新整合到主干,但是后来重新使用了分支.
另外,如果我查看file1.txt和file2.txt的mergeinfo,似乎file2.txt缺少featurebranch2的mergeinfo记录,所以问题出在file2.txt而不是file1.txt,如错误所示.因为在featurebranch2和file2.txt的生命周期中在trunk中更改了file1.txt,所以在步骤8的合并期间没有在file2.txt上设置关于trunk的mergeinfo.我相信这是它开始的地方脱轨 这不会影响重新集成到主干,但它确实会阻止功能分支重用.
编辑:对@David的响应W我尝试过--record-only -c 11,这也适用于Windows端.我已经在没有-c的情况下尝试了它(通常你不应该,我知道,但在这种情况下没有其他变化)然后它会报告:
svn: E200004: The required merge is reintegrate-like, and the record-only option
cannot be used with this kind of merge
Run Code Online (Sandbox Code Playgroud)
为了更好的衡量,我也试过--record-only -c 1-11,我所期望的与不使用-c相同(因为11是HEAD).我最初的期望是它会以不使用-c的方式失败,但事实并非如此.它以与-c 11相同的方式成功.
但我的帖子的重点是,使用SVN 1.8,我们不需要保持活力.(草案)文件说:
如果您在将其重新集成到主干后选择不删除分支,则可以继续从主干执行同步合并,然后再次重新集成分支[37].如果执行此操作,则只有在第一次重新集成后对分支所做的更改才会合并到主干.(http://svnbook.red-bean.com).
并从Subversion 1.8发行说明:
使用自动重新整合合并可以以任何顺序在两个分支之间来回合并(不再需要"保持活力的舞蹈").为获得最佳结果,建议始终合并所有符合条件的修订,即不使用svn merge的-r或-c选项.仅合并一部分符合条件的修订会增加未来合并期间出现问题的可能性.(https://subversion.apache.org/docs/release-notes/1.8.html)
所以我的观点是,没有keep alive trickery的这个分支重用显然不适用于本地mergeinfo,我的脚本似乎表明了这一点.
如果您仍然觉得有关丢失范围的警告可能是正确的,除了可能报告的范围编号,请告诉我在我的脚本中我导致缺少范围.我的脚本在主干和分支之间来回简单,而且两者都没有并行工作.
你也可以通过添加:"echo在trunk中创建的附加文件内容.>> trunk\file2.txt" 到第7步来解释为什么还修改file2.txt ,这将导致步骤10中没有错误.修改aditional文件在主干上无法解决丢失范围问题.
在 Subversion 邮件列表上:users@subversion.tigris.org 决定这个问题值得创建问题报告。有关详细信息,请参阅: 问题报告和 Subversion 用户邮件列表。
编辑:
从版本 1.8.9 开始,它已被修复(问题#4481)。谢谢!
归档时间: |
|
查看次数: |
2770 次 |
最近记录: |