Удалите ненужные свойства svn: mergeinfo - PullRequest
135 голосов
/ 20 апреля 2009

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

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

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

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

P.S. Я не ищу код API C ++ SVN.

Ответы [ 8 ]

138 голосов
/ 16 апреля 2010

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

Из корня проекта сделать:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
15 голосов
/ 08 марта 2010

Вот способ удалить все свойства 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.

12 голосов
/ 20 апреля 2009

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

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

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

Вот оно: svn-clean-mergeinfo

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

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

4 голосов
/ 24 марта 2010

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

2 голосов
/ 25 января 2013

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

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

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

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

2 голосов
/ 15 августа 2009

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

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

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

1 голос
/ 05 декабря 2011

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

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

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

...