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

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

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

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

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

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

9 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы внести изменения в структуру каталогов, это было бы (только для 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) скрипт, который может удалить явно лишнюю информацию о слиянии и рассказать о других различиях...

Запустите из корня вашего репозитория, чтобы удалить свойства svn:mergeinfo:

  • Команда для Баша:svn propdel -R -q svn:mergeinfo `svn ls`
  • Команда для PowerShell:svn propdel -R -q svn:mergeinfo (svn ls)

Преимущества этой команды:

  1. Он обрабатывает поддерево, но не корневой каталог;
  2. Обрабатывает скрытые («точечные») файлы;
  3. Он игнорирует файлы, которые не находятся под контролем версий.

PS. Команда может завершиться ошибкой, если вы зафиксировали файлы с пробелами (или другими необычными символами?) в именах в корневом каталоге.

Другие вопросы по тегам