Почему svn-слияние ветки без изменений приводит к тому, что нетронутые файлы изменяют свойство svn: mergeinfo

Я создал ветку под названием "feature3" из моего сундука. Я делаю нулевые изменения в файлах в ветке "feature3". Также нет изменений в файлах на багажнике. Используя TortoiseCVS (TortoiseSVN 1.6.6, Build 17493 - 32 бит) против SVN (версия 1.6.3 (r38063)), я инициирую "Слияние" с выбранной опцией "Реинтегрировать ветвь".

Результат этой команды показывает 80 файлов, объединенных. Единственное, что изменилось в этих файлах, это свойство svn: mergeinfo. Но почему только эти 80 файлов? У меня есть сотни других файлов в проекте, у которых этого свойства не было.

Ниже приведен пример изменения свойства svn: mergeinfo в одном файле

До:

/trax/branches/current/Libraries/Security/Specifications/NotSpecification.cs:10292-10783 /trax/branches/feature 1/Libraries/Security/Specifications/NotSpecification.cs:11324 /trax/branches/feature 2/Libraries/Security/Specifications/NotSpecification.cs:11326 /trax/branches/int/Libraries/Security/Specifications/NotSpecification.cs:11232-11314 /trax/branches/next/Libraries/Security/Specifications/NotSpecification.cs:10156-10782 /trax/branches/trax -1.0.x/Libraries/Security/Specifications/NotSpecification.cs:10191-10291 /trax/branches/upgrade/Libraries/Security/Specifications/NotSpecification.cs:9964-10604 /trax/tags/trax -1.0.0/Libraries/Security/Specifications/NotSpecification.cs:10178-10190 /trax/trunk/Libraries/Security/Specifications/NotSpecification.cs:6672-9851,11232-11325

После

/trax/branches/current/Libraries/Security/Specifications/NotSpecification.cs:10292-10783 /trax/branches/feature 1/Libraries/Security/Specifications/NotSpecification.cs:11324 /trax/branches/feature 2/Libraries/Security/Specifications/NotSpecification.cs:11326 /trax/branches/feature 3/Libraries/Security/Specifications/NotSpecification.cs:11328-11334 /trax/branches/int/Libraries/Security/Specifications/NotSpecification.cs:11232-11314 /trax/branches/next/Libraries/Security/Specifications/NotSpecification.cs:10156-10782 /trax/branches/trax -1.0.x/Libraries/Security/Specifications/NotSpecification.cs:10191-10291 /trax/branches/upgrade/Libraries/Security/Specifications/NotSpecification.cs:9964-10604 /trax/tags/trax -1.0.0/Libraries/Security/Specifications/NotSpecification.cs:10178-10190 /trax/trunk/Libraries/Security/Specifications/NotSpecification.cs:6672-9851,11324-11327

Изменения состоят в том, что эта строка была добавлена ​​

/trax/branches/feature3/Libraries/Security/Specifications/NotSpecification.cs:11328-11334

и последняя строка была изменена

/trax/trunk/Libraries/Security/Specifications/NotSpecification.cs:6672-9851,11324-11327

Я ожидал, что слияние приведет к объединению нулевых файлов. Почему SVN считает, что эти файлы необходимо объединить, и изменилось их свойство svn: mergeinfo? Есть ли способ исправить это?

Это случай, когда я должен удалить свойства svn: mergeinfo во всех 80 файлах? Я здесь ссылаюсь на здесь и здесь.

Этот тривиальный пример является частью более крупного исследования, в котором я создаю ветвь функции, делаю несколько изменений и затем пытаюсь объединить изменения обратно в магистраль. Тем не менее, слияние сообщает мне несколько конфликтов деревьев в этих же 80 файлах. Это очень расстраивает то, что я не могу использовать ветвление SVN из-за всех этих конфликтов деревьев.

Ответ 1

Но почему только эти 80 файлов?

Эти файлы имеют свойство svn:mergeinfo; другие - нет. Когда у отдельных файлов и подпапок проекта есть это, он называется "поддерево mergeinfo". Когда файл или папка имеет свойство "svn: mergeinfo", mergeinfo будет обновляться в каждой операции слияния.

Если вы слились только в корень вашего проекта и используете самую последнюю версию SVN-клиента, вы редко увидите поддерево mergeinfo. Только корневая папка ветвей проекта (например, /trunk, /branches/foo) должна иметь свойство svn:mergeinfo.

edit. Если вы просто удалите файл поддерева mergeinfo, то subversion не знает, что произошло слияние. По мере того как subquersion, subversion может попытаться объединить эти ревизии снова всякий раз, когда он выбирает ревизии, которые могут автоматически объединяться (например, когда вы делаете svn merge без указания опций -r или -c). В худшем случае такая попытка слияния может вызвать некоторые ложные конфликты, что не является большой проблемой; просто разрешите их вручную.

update: теперь Subversion 1.7 обновляет только mergeinfo, когда это необходимо. Из примечания к выпуску:

Сливается больше не записывает mergeinfo (описывающий слияние) в поддеревьях (у которых есть свой собственный явный mergeinfo), если поддерево не было затронуто слиянием. Это должно значительно уменьшить количество ложных изменений svn: mergeinfo для пользователей с большим количеством поддеревьев с явным mergeinfo.

Ответ 2

Откуда появился этот Mergeinfo?

Выше, вероятно, является лучшей отправной точкой для того, почему вы иногда получаете такой тип поведения mergeinfo. В Submerged blog есть некоторые СУЩЕСТВЕННЫЕ svn-слияния, хранящиеся в нем.

Пока я не читал этот следующий пост, этот файл выглядит потенциально полезным для вас:

Subversion 1.6.0 и конфликты дерева