Я создал ответвление, названное "feature3" от моей соединительной линии. Я делаю нулевые модификации в файлы на ответвлении "feature3". Нет также никаких модификаций в файлы на соединительной линии. Используя TortoiseCVS (TortoiseSVN 1.6.6, Сборка 17493 - 32 бита) против SVN (версия 1.6.3 (r38063)) repo, я инициирую "Слияние" с выбранной опцией "Reintegrate a branch".
Вывод этой команды показывает 80 объединенных файлов. Единственной вещью, измененной на этих файлах, является svn:mergeinfo свойство. Но почему только эти 80 файлов? У меня есть сотни других файлов в проекте, которому не изменили это свойство.
Вот пример изменения в svn:mergeinfo свойстве на единственном файле
Прежде:
/trax/branches/current/Libraries/Security/Specifications/NotSpecification.cs:10292-10783/trax/branches/feature1/Libraries/Security/Specifications/NotSpecification.cs:11324/trax/branches/feature2/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/feature1/Libraries/Security/Specifications/NotSpecification.cs:11324/trax/branches/feature2/Libraries/Security/Specifications/NotSpecification.cs:11326/trax/branches/feature3/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 из-за всех этих древовидных конфликтов.
Но почему только эти 80 файлов?
Эти файлы имеют свойство svn:mergeinfo
, остальные нет. Когда отдельные файлы и подпапки проекта имеют это свойство, оно называется "subtree mergeinfo". Как только файл или папка имеет свойство "svn:mergeinfo", информация о слиянии будет обновляться при каждой операции слияния.
Если вы сливаете только в корне вашего проекта и используете последнюю версию клиента SVN, вы редко увидите информацию о слиянии в поддеревьях. Только корневая папка ветвей проекта (например, /trunk
, /branches/foo
) должна иметь свойство svn:mergeinfo
.
редактирование : Если вы просто удалите информацию о слиянии поддеревьев, то диверсия не будет знать, что произошло слияние. В качестве согласия, subversion может попытаться слить эти ревизии снова, когда позволит ей автоматически выбирать ревизии, допустимые для слияния (например, когда вы делаете слияние svn
без указания параметров -r
или -c
). В худшем случае такая попытка слияния может спровоцировать несколько поддельных конфликтов, что не является большой проблемой; просто разрешите их вручную.
update: Теперь Subversion 1.7 обновляет информацию о слиянии только тогда, когда это необходимо. Из примечаний к релизу:
Слияния больше не записывают информацию о слиянии (описывающую слияние) в поддеревьях (у которых есть своя явная информация о слиянии), если слияние не повлияло на поддеревье. Это должно значительно уменьшить количество поддельных изменений свойства svn:mergeinfo для пользователей, которые имеют большое количество поддеревьев с явным слиянием.
Вышеприведенное, вероятно, является наилучшей отправной точкой для объяснения того, почему вы иногда получаете такой тип поведения при слиянии. В блоге Submerged blog хранятся некоторые ЭССЕНЦИАЛЬНЫЕ знания по слиянию svn.
Хотя я не читал это следующее сообщение, это сообщение выглядит потенциально полезным и для вас: