Безопасно ли вручную редактировать mergeinfo?
Я провел некоторое исследование того, почему слияния подкаталогов плохи, и недавно обнаружил подкаталог в нашем репозитории, в котором есть mergeinfo.
Я пытаюсь удалить эту информацию о слиянии вручную и хочу узнать, правильно ли я понимаю mergeinfo и правильно ли это делаю.
ROOTDIR mergeinfo
/ Филиалы / Iteration53: 18065-18126
/ Филиалы / Iteration54: 18150-18204,18210-18231
/ branch /Iteration55:18341,18348,18353-18355,18357,18364-18365 <===== Эта строка отличается
/ Филиалы / gdsRework: 17329-17457
/ Ствол:17869,18085
SUBDIR mergeinfo
/ Филиалы / Iteration53 / новозеландский веб: 18065-18126
/ Филиалы / Iteration54 / новозеландский веб: 18150-18204,18210-18231
/ branch /Iteration55/kiwi-web:18336-18428 <===== Эта строка отличается
/ Филиалы /gdsRework/ новозеландский веб: 17329-17457
/ Багажник / новозеландский веб:17869,18085
Существует только одна строка, которая отличается между этими двумя. Я также заметил, что диапазон 18336-18428 в SUBDIR mergeinfo включает в себя все ревизии той же строки в ROOTDIR mergeinfo.
Поэтому я планирую просто заменить эту строку в ROOTDIR на строку в SUBDIR и полностью удалить SUBDIR mergeinfo:
Новый ROOTDIR merginfo
/ Филиалы / Iteration53: 18065-18126
/ Филиалы / Iteration54: 18150-18204,18210-18231
/ branch /Iteration55:18336-18428 <===== Теперь аналогично SUBDIR mergeinfo
/ Филиалы / gdsRework: 17329-17457
/ Ствол:17869,18085
SUBDIR mergeinfo удален.
Это безопасно? Где будут подводные камни? Заранее спасибо.
1 ответ
Не рекомендуется вручную редактировать mergeinfo. Хотя в прошлом я делал что-то похожее на описанное вами, даже несмотря на то, что различия между root и subdir были более сложными, такое редактирование очень подвержено ошибкам и поэтому требует особой осторожности и точности. Как я узнал позже, SVN достаточно мощен, чтобы довольно легко исправить такую ситуацию; так что лучше даже не заводить ручное редактирование MergeInfo.
Простой случай, когда "лишние" ревизии, записанные в SUBDIR mergeinfo, влияют только на этот подкаталог. В этом случае все, что вам нужно, - это выполнить слияние ревизий с 18336 по 18428 только для записи на уровне ROOTDIR. Объединение только для записи обновит информацию о слиянии для ROOTDIR, не затрагивая никаких файлов, и, поскольку слияние SUBDIR будет точно таким же, как и для ROOTDIR, оно удалит это как чрезмерное.
- Если вы используете команды SVN напрямую, просто добавьте
--record-only
вариант кsvn merge
команда, которую вы использовали бы для реального слияния. - Если вы используете клиент с графическим интерфейсом, найдите в диалоговом окне слияния параметр "только запись" или аналогичное имя.
Помните о разнице между диапазоном в mergeinfo (который включает в себя как его концы, так и все, что между ними) и диапазоном в -r
опция (которая определяет две ревизии, для которых нужно использовать diff); например, в командной строке вам нужно указать -r 18335:18428
Т.е. начальная ревизия для принятия различий на единицу меньше первой, подлежащей объединению.
Более сложный случай, если эти ревизии объединяются в SUBDIR, но не в ROOTDIR, и также изменяют файлы вне SUBDIR. Вполне вероятно, что эти изменения еще не были объединены. Если игнорировать эти изменения безопасно, вы можете также выполнить слияние только для записей. Напротив, если эти изменения были пропущены, вы, вероятно, захотите сделать регулярное слияние для ревизий на уровне ROOTDIR и исправить конфликты слияния, если таковые имеются.
После того, как слияние (или только запись, или обычное) выполнено, убедитесь, что информация о слиянии правильно изменена для каталогов, и зафиксируйте результат.
Хорошая статья, в которой я много узнал о mergeinfo и о том, как она управляется командами SVN (включая слияние только записей, elgeinfo elision и т. Д.), Находится здесь: Subversion 1.5 Mergeinfo - Понимание внутренних элементов. Я рекомендую вам прочитать это, прежде чем пытаться исправить mergeinfo в вашем хранилище.