Given the subject line, I guess most of you realised that this mail is intended for Paul and any other merge-tracking nerds on this list :)
Attached is a script that shows a merge which removes mergeinfo for the merge target for no explicable reason (at least I can't see a reason for removing it). The output of the script is below. The part I don't understand is why mergeinfo for trunk shows up as reverse-merged in the last diff shown in the output: Property changes on: trunk-mergeinfo-reverted/feature2 ___________________________________________________________________ Modified: svn:mergeinfo Reverse-merged /trunk:r10-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The problem is that feature sync merges from trunk to feature2 will not work as intended after this change is committed. feature2 has already had changes of trunk merged into it in the past, and with the mergeinfo for trunk removed, all those changes will be merged again. See the comments in the script for more information. This problem can be reproduced with trunk and 1.6.x. Can someone explain this behaviour? Is this correct or do we have a bug? The people who ran into this are helping themselves for now by restoring the reverted mergeinfo with a --record-only merge prior to syncing feature2 to trunk again. This is not ideal though... Thanks, Stefan Output: + rm -rf trunk-mergeinfo-reverted + mkdir -p trunk-mergeinfo-reverted + mkdir -p trunk-mergeinfo-reverted/trunk + echo alpha + > trunk-mergeinfo-reverted/trunk/alpha + echo beta + > trunk-mergeinfo-reverted/trunk/beta + mkdir trunk-mergeinfo-reverted/trunk/gamma + echo delta + > trunk-mergeinfo-reverted/trunk/gamma/delta + mkdir trunk-mergeinfo-reverted/trunk/epsilon + echo zeta + > trunk-mergeinfo-reverted/trunk/epsilon/zeta + svnadmin create /tmp/trunk-mergeinfo-reverted/repos + svn import trunk-mergeinfo-reverted/trunk file:////tmp/trunk-mergeinfo-reverted/repos/trunk -m importing project tree Adding trunk-mergeinfo-reverted/trunk/gamma Adding trunk-mergeinfo-reverted/trunk/gamma/delta Adding trunk-mergeinfo-reverted/trunk/alpha Adding trunk-mergeinfo-reverted/trunk/epsilon Adding trunk-mergeinfo-reverted/trunk/epsilon/zeta Adding trunk-mergeinfo-reverted/trunk/beta Committed revision 1. + svn copy --parents file:////tmp/trunk-mergeinfo-reverted/repos/trunk file:////tmp/trunk-mergeinfo-reverted/repos/branches/firstbranch -m creating branch Committed revision 2. + rm -rf trunk-mergeinfo-reverted/trunk + svn checkout file:////tmp/trunk-mergeinfo-reverted/repos/trunk trunk-mergeinfo-reverted/trunk A trunk-mergeinfo-reverted/trunk/gamma A trunk-mergeinfo-reverted/trunk/gamma/delta A trunk-mergeinfo-reverted/trunk/alpha A trunk-mergeinfo-reverted/trunk/epsilon A trunk-mergeinfo-reverted/trunk/epsilon/zeta A trunk-mergeinfo-reverted/trunk/beta Checked out revision 2. + svn checkout file:////tmp/trunk-mergeinfo-reverted/repos/trunk trunk-mergeinfo-reverted/trunk2 A trunk-mergeinfo-reverted/trunk2/gamma A trunk-mergeinfo-reverted/trunk2/gamma/delta A trunk-mergeinfo-reverted/trunk2/alpha A trunk-mergeinfo-reverted/trunk2/epsilon A trunk-mergeinfo-reverted/trunk2/epsilon/zeta A trunk-mergeinfo-reverted/trunk2/beta Checked out revision 2. + svn checkout file:////tmp/trunk-mergeinfo-reverted/repos/branches/firstbranch trunk-mergeinfo-reverted/branch A trunk-mergeinfo-reverted/branch/gamma A trunk-mergeinfo-reverted/branch/gamma/delta A trunk-mergeinfo-reverted/branch/alpha A trunk-mergeinfo-reverted/branch/epsilon A trunk-mergeinfo-reverted/branch/epsilon/zeta A trunk-mergeinfo-reverted/branch/beta Checked out revision 2. + echo aaa + >> trunk-mergeinfo-reverted/branch/alpha + svn ci trunk-mergeinfo-reverted/branch -m change branch Sending trunk-mergeinfo-reverted/branch/alpha Transmitting file data . Committed revision 3. + svn up trunk-mergeinfo-reverted/trunk At revision 3. + svn merge --reintegrate file:////tmp/trunk-mergeinfo-reverted/repos/branches/firstbranch trunk-mergeinfo-reverted/trunk --- Merging differences between repository URLs into 'trunk-mergeinfo-reverted/trunk': U trunk-mergeinfo-reverted/trunk/alpha --- Recording mergeinfo for merge between repository URLs into 'trunk-mergeinfo-reverted/trunk': U trunk-mergeinfo-reverted/trunk + svn ci trunk-mergeinfo-reverted/trunk -m reintegrated branch Sending trunk-mergeinfo-reverted/trunk Sending trunk-mergeinfo-reverted/trunk/alpha Transmitting file data . Committed revision 4. + svn rm file:////tmp/trunk-mergeinfo-reverted/repos/branches/firstbranch -m remove branch Committed revision 5. + rm -rf trunk-mergeinfo-reverted/branch + svn cp file:////tmp/trunk-mergeinfo-reverted/repos/trunk file:////tmp/trunk-mergeinfo-reverted/repos/branches/feature1 -m create feature1 branch Committed revision 6. + svn co file:////tmp/trunk-mergeinfo-reverted/repos/branches/feature1 trunk-mergeinfo-reverted/feature1 A trunk-mergeinfo-reverted/feature1/gamma A trunk-mergeinfo-reverted/feature1/gamma/delta A trunk-mergeinfo-reverted/feature1/alpha A trunk-mergeinfo-reverted/feature1/epsilon A trunk-mergeinfo-reverted/feature1/epsilon/zeta A trunk-mergeinfo-reverted/feature1/beta U trunk-mergeinfo-reverted/feature1 Checked out revision 6. + echo bbb + >> trunk-mergeinfo-reverted/feature1/beta + svn ci trunk-mergeinfo-reverted/feature1 -m work on feature1 Sending trunk-mergeinfo-reverted/feature1/beta Transmitting file data . Committed revision 7. + echo zzz + >> trunk-mergeinfo-reverted/trunk/epsilon/zeta + svn ci trunk-mergeinfo-reverted/trunk -m some work on trunk Sending trunk-mergeinfo-reverted/trunk/epsilon/zeta Transmitting file data . Committed revision 8. + svn up trunk-mergeinfo-reverted/feature1 At revision 8. + svn merge file:////tmp/trunk-mergeinfo-reverted/repos/trunk trunk-mergeinfo-reverted/feature1 --- Merging r6 through r8 into 'trunk-mergeinfo-reverted/feature1': U trunk-mergeinfo-reverted/feature1/epsilon/zeta --- Recording mergeinfo for merge of r6 through r8 into 'trunk-mergeinfo-reverted/feature1': U trunk-mergeinfo-reverted/feature1 + svn ci trunk-mergeinfo-reverted/feature1 -m sync with trunk Sending trunk-mergeinfo-reverted/feature1 Sending trunk-mergeinfo-reverted/feature1/epsilon/zeta Transmitting file data . Committed revision 9. + svn cp file:////tmp/trunk-mergeinfo-reverted/repos/trunk file:////tmp/trunk-mergeinfo-reverted/repos/branches/feature2 -m create feature2 branch Committed revision 10. + svn co file:////tmp/trunk-mergeinfo-reverted/repos/branches/feature2 trunk-mergeinfo-reverted/feature2 A trunk-mergeinfo-reverted/feature2/gamma A trunk-mergeinfo-reverted/feature2/gamma/delta A trunk-mergeinfo-reverted/feature2/alpha A trunk-mergeinfo-reverted/feature2/epsilon A trunk-mergeinfo-reverted/feature2/epsilon/zeta A trunk-mergeinfo-reverted/feature2/beta U trunk-mergeinfo-reverted/feature2 Checked out revision 10. + echo aaaa + >> trunk-mergeinfo-reverted/feature2/alpha + svn ci trunk-mergeinfo-reverted/feature2 -m work on feature2 Sending trunk-mergeinfo-reverted/feature2/alpha Transmitting file data . Committed revision 11. + svn up trunk-mergeinfo-reverted/trunk At revision 11. + svn merge --reintegrate file:////tmp/trunk-mergeinfo-reverted/repos/branches/feature2 trunk-mergeinfo-reverted/trunk --- Merging differences between repository URLs into 'trunk-mergeinfo-reverted/trunk': U trunk-mergeinfo-reverted/trunk/alpha --- Recording mergeinfo for merge between repository URLs into 'trunk-mergeinfo-reverted/trunk': U trunk-mergeinfo-reverted/trunk + svn ci trunk-mergeinfo-reverted/trunk -m reintegrate bugfix from feature2 branch Sending trunk-mergeinfo-reverted/trunk Sending trunk-mergeinfo-reverted/trunk/alpha Transmitting file data . Committed revision 12. + svn up trunk-mergeinfo-reverted/feature2 At revision 12. + svnlook youngest trunk-mergeinfo-reverted/repos + svn merge -c 12 --record-only file:////tmp/trunk-mergeinfo-reverted/repos/trunk trunk-mergeinfo-reverted/feature2 --- Merging r12 into 'trunk-mergeinfo-reverted/feature2': U trunk-mergeinfo-reverted/feature2 --- Recording mergeinfo for merge of r12 into 'trunk-mergeinfo-reverted/feature2': U trunk-mergeinfo-reverted/feature2 + svn ci trunk-mergeinfo-reverted/feature2 -m block reintegration revision Sending trunk-mergeinfo-reverted/feature2 Committed revision 13. + svn up trunk-mergeinfo-reverted/feature2 At revision 13. + svn merge file:////tmp/trunk-mergeinfo-reverted/repos/trunk trunk-mergeinfo-reverted/feature2 --- Recording mergeinfo for merge of r10 through r13 into 'trunk-mergeinfo-reverted/feature2': U trunk-mergeinfo-reverted/feature2 + svn ci trunk-mergeinfo-reverted/feature2 -m sync with trunk Sending trunk-mergeinfo-reverted/feature2 Committed revision 14. + svn up trunk-mergeinfo-reverted/feature1 At revision 14. + svn merge file:////tmp/trunk-mergeinfo-reverted/repos/trunk trunk-mergeinfo-reverted/feature1 --- Merging r9 through r14 into 'trunk-mergeinfo-reverted/feature1': U trunk-mergeinfo-reverted/feature1/alpha G trunk-mergeinfo-reverted/feature1 --- Recording mergeinfo for merge of r9 through r14 into 'trunk-mergeinfo-reverted/feature1': G trunk-mergeinfo-reverted/feature1 + svn ci trunk-mergeinfo-reverted/feature1 -m sync with trunk Sending trunk-mergeinfo-reverted/feature1 Sending trunk-mergeinfo-reverted/feature1/alpha Transmitting file data . Committed revision 15. + svnlook youngest trunk-mergeinfo-reverted/repos + rebase_rev=15 + svn up trunk-mergeinfo-reverted/feature2 At revision 15. + svn merge file:////tmp/trunk-mergeinfo-reverted/repos/tr...@15 file:////tmp/trunk-mergeinfo-reverted/repos/branches/feature1 trunk-mergeinfo-reverted/feature2 --- Merging differences between repository URLs into 'trunk-mergeinfo-reverted/feature2': U trunk-mergeinfo-reverted/feature2/beta G trunk-mergeinfo-reverted/feature2 --- Recording mergeinfo for merge between repository URLs into 'trunk-mergeinfo-reverted/feature2': G trunk-mergeinfo-reverted/feature2 G trunk-mergeinfo-reverted/feature2 + svn diff trunk-mergeinfo-reverted/feature2 Property changes on: trunk-mergeinfo-reverted/feature2 ___________________________________________________________________ Modified: svn:mergeinfo Reverse-merged /trunk:r10-13 Merged /branches/feature1:r6-15 Index: trunk-mergeinfo-reverted/feature2/beta =================================================================== --- trunk-mergeinfo-reverted/feature2/beta (revision 15) +++ trunk-mergeinfo-reverted/feature2/beta (working copy) @@ -1 +1,2 @@ beta +bbb + svn pg -v -R svn:mergeinfo trunk-mergeinfo-reverted/feature2 Properties on 'trunk-mergeinfo-reverted/feature2': svn:mergeinfo /branches/feature1:6-15 /branches/firstbranch:2-3
#!/bin/sh set -e cwd=`pwd` basename=`basename $0` scratch_area="`echo $basename | sed -e s/\.sh$//`" repos=$scratch_area/repos trunk=$scratch_area/trunk branch=$scratch_area/branch feature1=$scratch_area/feature1 feature2=$scratch_area/feature2 rebase=$scratch_area/rebase trunk_url=file:///$cwd/$repos/trunk branch_url=file:///$cwd/$repos/branches/firstbranch feature1_url=file:///$cwd/$repos/branches/feature1 feature2_url=file:///$cwd/$repos/branches/feature2 rebase_url=file:///$cwd/$repos/branches/rebase set -x rm -rf $scratch_area mkdir -p $scratch_area mkdir -p $trunk echo alpha > $trunk/alpha echo beta > $trunk/beta mkdir $trunk/gamma echo delta > $trunk/gamma/delta mkdir $trunk/epsilon echo zeta > $trunk/epsilon/zeta svnadmin create $cwd/$repos svn import $trunk $trunk_url -m "importing project tree" svn copy --parents $trunk_url $branch_url -m "creating branch" rm -rf $trunk svn checkout $trunk_url $trunk svn checkout $trunk_url ${trunk}2 svn checkout $branch_url $branch # Create some mergeinfo using the branch we just created. # Make some changes in the branch, reintegrate and delete it. # This is done only to have some prior merge history in mergeinfo. # It may or may not be relevant to the problem. echo aaa >> $branch/alpha svn ci $branch -m "change branch" svn up $trunk svn merge --reintegrate $branch_url $trunk svn ci $trunk -m "reintegrated branch" svn rm $branch_url -m "remove branch" rm -rf $branch # Create a feature1 branch svn cp $trunk_url $feature1_url -m "create feature1 branch" svn co $feature1_url $feature1 echo bbb >> $feature1/beta svn ci $feature1 -m "work on feature1" # Do something on trunk echo zzz >> $trunk/epsilon/zeta svn ci $trunk -m "some work on trunk" # Sync feature1 branch to trunk svn up $feature1 svn merge $trunk_url $feature1 svn ci $feature1 -m "sync with trunk" # Create a feature2 branch, do some work on it svn cp $trunk_url $feature2_url -m "create feature2 branch" svn co $feature2_url $feature2 echo aaaa >> $feature2/alpha svn ci $feature2 -m "work on feature2" # Reintegrate the feature2 branch svn up $trunk svn merge --reintegrate $feature2_url $trunk svn ci $trunk -m "reintegrate bugfix from feature2 branch" # Keep the feature2 branch alive, we need to do more work still. # This creates mergeinfo on the feature2 branch for trunk. svn up $feature2 svn merge -c `svnlook youngest $repos` --record-only $trunk_url $feature2 svn ci $feature2 -m "block reintegration revision" # Sync the feature2 branch with trunk. # This creates more mergeinfo on the feature2 branch for trunk (though # nothing is actually merged). svn up $feature2 svn merge $trunk_url $feature2 svn ci $feature2 -m "sync with trunk" # Sync the feature1 branch with trunk. svn up $feature1 svn merge $trunk_url $feature1 svn ci $feature1 -m "sync with trunk" rebase_rev=`svnlook youngest $repos` # Management decided that feature1 should be merged with feature2. # feature1 is based on the code base of trunk, so we'll have some # integration work to do to merge with feature2. # So do a 'rebase' of the feature1 -- this means merging the diff # trunk->feature1 into the feature2 branch. svn up $feature2 svn merge $trunk_...@$rebase_rev $feature1_url $feature2 # Ooops... Why does the mergeinfo for trunk get reverted? # Without it, we cannot sync the feature2 branch to trunk anymore :( svn diff $feature2 svn pg -v -R svn:mergeinfo $feature2 # Alternative case, with a temporary integration branch, same problem: #svn cp $feature2_url $rebase_url -m "create rebase branch" #svn co $rebase_url $rebase #svn merge $trunk_...@$rebase_rev $feature1_url $rebase #svn diff $rebase #svn pg -v -R svn:mergeinfo $rebase