Удалить ненужные свойства svn: mergeinfo

Когда я объединяю вещи в моем репозитории, Subversion хочет добавить/изменить много свойств svn:mergeinfo к файлам, которые полностью не связаны с вещами, которые я хочу объединить.

Вопросы об этом поведении были заданы здесь в разделе "Переполнение стека":

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

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

P.S. Я не ищет код API SVN С++.

Ответ 1

Вот еще один способ удалить все свойства svn: mergeinfo, но не в корневую папку (это необходимо для правильной работы ветвления).

Из корня проекта выполните:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"

Ответ 2

Вот способ удаления всех свойств svn: mergeinfo. Запустите его в корневом каталоге вашего репозитория:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

Все в одной строке для удобства копирования/вставки:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

Чтобы просмотреть, какие файлы это повлияет, прежде чем запускать его, измените последнее "propdel" на "propget" или вообще удалите последнюю трубку xargs.

Ответ 3

Как упоминалось в этот поток:

  • Большинство пустых mergeinfo ( "blank" ) могут быть вызваны рабочей копией в копии рабочей копии/перемещения, где исходный элемент не имеет явного mergeinfo. Использование propdel может быть решением, если вы не используете 1.6 SVN: поскольку 1.5.5 эти копии WC-to-WC больше не создают пустой mergeinfo в целевом
  • предыдущая операция реструктуризации svn move (rename) может также распространять mergeinfo, а не оставлять их в корневом каталоге
  • существует потенциальная проблема с памятью, отслеживаемая case 3393, которая будет исправлена ​​в следующей версии 1.6.2 и обратно перенесена в 1.5

Ответ 4

Как я не уверен в исключении свойств blind svn:merge-info, я внедрил инструмент для анализа текущей ситуации на рабочей копии и удалил как можно больше изменений слияния из свойств non-root merge-info. После дополнительных проверок и элементов управления, изменения в рабочей копии могут быть зафиксированы.

Вот он: svn-clean-mergeinfo

Не стесняйтесь сообщать о какой-либо проблеме его использования, чтобы улучшить его.

Subversion 1.10 представляет новый инструмент, посвященный этой задаче: svn-mergeinfo-normalizer

Ответ 5

Если вы уверены, что хотите массово удалить свойства mergeinfo, вы можете использовать следующие BASH script.

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

Он получает список измененных файлов, фильтрует его только для изменения только mergeinfo, разбивает все, кроме фактического пути к файлу, преобразует однострочные пути в список с разделителями пробелов, а вызовы возвращаются в этот список.

Ответ 6

Я знаю, что это было какое-то время, но у меня возникла аналогичная проблема. Я использую TortoiseSVN 1.6.7. Так получилось, что собственность была в корне моей рабочей копии. Когда я просмотрел свойства в корне и нажал "Удалить" на svn: mergeinfo, он спросил меня, хочу ли я удалить его рекурсивно. Это избавило меня от всех моих svn: mergeinfo cockups.

Ответ 7

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

Скопируйте свойство mergeinfo из корневой папки и затем выполните слияние в дочерней папке для соответствующего относительного пути и одного и того же списка изменений. (Вы можете, но не нужно, только перечислять различия между этим списком и тем, который уже находится в дочерней папке.)

Обычно это слияние должно привести только к изменению свойств mergeinfo, а не к фактическим файлам. (Если он в конечном итоге меняет файлы, то одно из предыдущих слияний должно быть только частичным слиянием, которое, возможно, вызывало у вас проблемы).

Выполнение этого должно привести к удалению свойства mergeinfo для вас, как только вы получите их обоих, чтобы точно соответствовать. Вам также может понадобиться сделать обратное: объединить в корень любые изменения слияния, только присутствующие в дочерней папке (опять же, вы можете просто вставить полный список и позволить SVN разобраться в обнаружении различий для вас).

Ответ 8

Чтобы внести изменения в структуру каталогов, это будет (только не DOS "найти" ):

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

Запуск клиента 1.6.12, подключенного к серверу 1.5, у меня аналогичная проблема; есть подкаталог в проекте, который нуждается в собственном svn: mergeinfo, но наличие 121 таких записей (включая 5 каталогов ниже. /var с "svn: ignore *" ) кажется несколько неуместным. Таким образом, было бы неплохо иметь (например, Python) script, который может удалить явно избыточную информацию о слиянии и рассказать о других отличиях...