Subversion: Merge, Revert, Merge снова. Почему это терпит неудачу?

Является ли это неприятной ошибкой Subversion или я приближаюсь к ней неправильно?

Объедините ветку в багажник. - > Обновления HelloWorld.txt

Вернуть HelloWorld.txt

Повторите то же самое слияние. - > Нет обновления файлов.

Почему второе слияние не обновляет HelloWorld? Он действует так, как будто это изменение уже скопировано. Не следует ли вернуть reset?

Если вы вернете всю папку HelloWorld, вторая слияния снова применит это изменение снова. Это только если вы отмените файл, который он терпит неудачу.

Это немного страшно. Что делать, если мне нужно отменить некоторые файлы на данный момент. Любое последующее слияние будет без проблем копировать критический код.

Subversion 1.6 OS X 10.6.4

Ответы

Ответ 1

Subversion выполняет отслеживание слиянием, то есть записывает, какие изменения уже были объединены. Информация о слиянии записывается в свойстве с именем svn:mergeinfo в корне слияния (т.е. Независимо от того, что вы ввели в качестве цели после svn merge). Вы вернули файл, но, вероятно, не вернули корень слияния, который содержит модифицированное или добавленное свойство svn:mergeinfo.

Ответ 2

Этот контент описан в документации svn Расширенное слияние (см. примечание 23). Когда вы сначала объедините свое изменение, объединенный номер версии отслеживается в свойстве svn:mergeinfo. Если вы отмените свои изменения, ревизия по-прежнему будет помечена как объединенная, чтобы предотвратить повторное объединение ее по ошибке. Дело в том, что если вы удалили его, у вас мало шансов, что вы захотите его вернуть...

Если вы действительно хотите снова объединить его, вы можете использовать опцию --ignore-ancestry, которая не будет проверять svn:mergeinfo, если переработка была ранее объединена. Другим решением является намеренное удаление этой версии с svn:mergeinfo, чтобы ее можно было снова объединить в будущем. Но не делайте этого вручную, используйте для этого команду --record-only команды svn merge.

Ответ 3

Сандерс прав.

Не думайте, что вы копируете состояния. Вы "берете" изменения и применяете их снова к другой цели (что идеально относится к началу слияния).

До svn 1.5 нам пришлось отслеживать изменения вручную при слиянии. "У меня слияние r28445 с r28501 из этой ветки? Я не хочу повторно использовать изменения, которые я сделал allready: -/"

Это была головная боль;)

svn, поскольку 1.5 отслеживает то, что вы делали в прошлом, и будет применять одно и то же историческое изменение один раз к уникальному месту назначения.

Вы можете отключить эту дружественную проверку, используя "--ignore-ancestry" в вашей команде svn merge. Будьте готовы получить много изменений в том, что вы применили allready. Уточните, что вы хотите получить, указав ревизию.

svn merge --ignore-ancestry -c REVISION_WITH_CHANGE http://mysvn/path/to/mergeorigin