Remove unnecessary svn:mergeinfo properties

Viewed 67767

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:

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.

9 Answers

Here is a way to delete all subtree svn:mergeinfo properties. Run it inside the root of your repository:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

All in one line for easy copy/pasting:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

To preview which files this will effect before you run it, change the last "propdel" to "propget" or remove the last xargs pipe altogether.

As mentioned in this thread:

  • Most empty mergeinfo ("blank") can be caused by working copy to working copy copies/moves where the source item has no explicit mergeinfo. Using propdel can be the solution unless you are using a 1.6 SVN: since 1.5.5 these WC-to-WC copies no longer create empty mergeinfo on the destination
  • an earlier svn move (rename) restructuring operation can also propagate mergeinfo, instead of leaving them at the root directory
  • there is a potential memory issue, tracked by case 3393 which will be fixed in an upcoming 1.6.2 version and back-ported in 1.5

Run from the root of your repository to delete svn:mergeinfo properties:

  • Command for Bash: svn propdel -R -q svn:mergeinfo `svn ls`
  • Command for PowerShell: svn propdel -R -q svn:mergeinfo (svn ls)

Benefits of this command:

  1. It processes subtree, but not the root directory;
  2. It processes hidden ("dot") files;
  3. It ignores files, that aren't under version control.

PS. Command may fail if you have committed files with spaces (or other unusual symbols?) in their names in the root directory.

Related