When I merge stuff in my repository Subversion wants to add/change a lot of svn:mergeinfo
properties to files that are totally unrelated to the things that I want to merge.
Questions about this behaviour have been asked before here on Stack Overflow:
- SVN Mergeinfo properties on paths other than the working copy root
- Is there a way to turn TortoiseSVN using svn:mergeinfo off?
From what I understand from the topics mentioned above it looks like a lot of files in my repository have explicit svn:mergeinfo
properties on them, when they shouldn't. The advice is to reduce the amount and only put those properties on relevant files/folders.
So now my question: how can I easily remove those unneeded properties? I'm using TortoiseSVN, but I am reluctant to manually check/fix hundreds of files. Is there an easier way to remove those unnecessary svn:mergeinfo
properties?
P.S. I'm not looking for C++ SVN API code.
As mentioned in this thread:
Rather than just blindly deleting the mergeinfo properties, it's also possible to complete the "missing" merges.
Copy the mergeinfo property from the root folder, and then perform a merge on the child folder for the appropriate relative path and the exact same revision list. (You can, but do not need to, only list the differences between this list and the one already on the child folder.)
Normally this merge should end up only changing the mergeinfo properties, not any actual files. (If it does end up changing files, then one of the previous merges must have only been a partial merge, which may have been causing you problems anyway.)
Doing this should end up deleting the mergeinfo property for you, once you've gotten them both to match exactly. You may also need to do the reverse: merge into the root any merge revisions only present on the child folder (again, you can just paste the full list and let SVN sort out finding the differences for you).
As I am not confident with blind
svn:merge-info
property deletion, I have implemented a tool to analyze the current situation on a working copy and remove as much merge revisions as possible from non-root merge-info properties. After additional human checks and controls, the changes on the working copy can be committed.Here it is: svn-clean-mergeinfo
Do not hesitate to report any issue about its usage to get it improved.
Subversion 1.10 introduces a new tool dedicated to that task:
svn-mergeinfo-normalizer
If you're sure you want to mass-remove mergeinfo properties, you can use the following BASH script.
It gets a list of changed files, filters it to just mergeinfo only changes, strips everything but the actual file path, converts the one-per-line paths into a space delimited list, and the calls revert on that list.
Here is another way to delete all sub tree svn:mergeinfo properties but not at the root folder (this is needed for branching to work properly).
From the root of the project do:
To do changes in a directory structure, this would be (non-DOS 'find' only):
Running an 1.6.12 client connected to an 1.5 server, I have a similar problem; there is a subdirectory in the project which needs its own svn:mergeinfo, but having 121 such entries (including 5 directories below ./var with "svn:ignore *") seems somewhat inappropriate. Thus, it would be nice to have a (e.g. Python) script which is able to remove the obviously superfluous merge info and tell about other differences ...