141

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.

dokaspar
  • 8,186
  • 14
  • 70
  • 98
LeonZandman
  • 3,054
  • 6
  • 29
  • 26

9 Answers9

145

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:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
Vincent
  • 2,712
  • 5
  • 24
  • 27
  • 60
    Or, just don't do it on the root dir "svn propdel -R svn:mergeinfo ./*" – JeremyWeir Feb 18 '11 at 17:20
  • 3
    "svn propdel -R svn:mergeinfo ./* ./.[^.]*" if you also have "dot" / *ix hidden files, probably not a problem for a Windows user per the question. – Peter Nov 08 '13 at 03:53
  • 3
    suppressing the output speeds it up: "svn propdel svn:mergeinfo -R >nul" (or >/dev/null using Linux) – bebbo May 20 '14 at 18:18
  • 2
    @JeremyWeir What do you mean by "just don't do it on the root dir"? Where from then? You have a lot of upvotes on that comment, but I'm not seeing the alternative. – TT. Apr 26 '16 at 06:46
  • 3
    @TT. I think the idea is to just go to the dir that has all the messed up merge info and do it from there, so you don't have to revert the root directory. You don't want to mess with the mergeinfo of the root. – JeremyWeir Apr 26 '16 at 18:09
15

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.

Kelvin
  • 965
  • 2
  • 10
  • 13
  • 2
    Works with hyphens in files: svn propget -R svn:mergeinfo | grep -v "^/" | grep -v "^\." | cut "-d " -f1 | xargs svn propdel svn:mergeinfo – Squirrel Apr 29 '10 at 13:56
12

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
opello
  • 3,254
  • 2
  • 23
  • 23
VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250
6

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

Yves Martin
  • 10,217
  • 2
  • 38
  • 77
  • 2
    This tool is great for consolidating merge-info properties, like the kinds that get created with partial subdirectory merges which many less than perfectly coordinated developers on a large team may create. The tool seems to have an issue with files that don't exist in every branch, I get leftover merge-info properties on files indicating revisions on branches in which the file never existed. – davenpcj Aug 11 '15 at 20:21
  • I agree it is not perfect... that is why "human checks and controls" are still required. In your case, if you have identified non relevant revisions in merge-info properties, you can remove these revisions or the whole svn:merge-info property on that files before committing. Please use github to ask for improvements. – Yves Martin Aug 15 '15 at 09:41
4

I know it's been a while, but I ran into a similar problem. I'm using TortoiseSVN 1.6.7. It just so happened that the property was on the root of my working copy. When I viewed the properties on the root and clicked Remove on svn:mergeinfo, it asked me if I want to remove it recursively. This got rid of all of my svn:mergeinfo cockups.

moribvndvs
  • 42,191
  • 11
  • 135
  • 149
2

If you're sure you want to mass-remove mergeinfo properties, you can use the following BASH script.

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

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.

Chase Seibert
  • 15,703
  • 8
  • 51
  • 58
  • 2
    Thanx, but as you may have known from me mentioning TortoiseSVN I'm a Windows user and don't use the Bash shell :-) – LeonZandman Sep 15 '09 at 11:03
  • The same thing should be possible in DOS, albeit probably not as terse. – Chase Seibert Sep 15 '09 at 17:04
  • 1
    Doesn't this only revert files with modified mergeinfo on the current working directory? If so, it doesn't address the problem: the existing explicit mergeinfo. For that, you'd need to propdel. – Dominic Scheirlinck Dec 22 '09 at 02:19
  • 2
    This is quite buggy -- have a filename with whitespace in its name? With glob characters in its name? Bad news in either case. The approved/supported way to parse the output from svn status is using the `--xml` flag and an XML parser; anything else can change between versions, as forwards compatibility on the textual output format is not guaranteed. – Charles Duffy Aug 15 '13 at 16:51
2

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).

Miral
  • 12,637
  • 4
  • 53
  • 93
1

To do changes in a directory structure, this would be (non-DOS 'find' only):

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \;

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 ...

Tobias
  • 2,481
  • 3
  • 26
  • 38
0

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.