Удалите ненужные свойства svn:mergeinfo
Когда я объединяю вещи в моем хранилище, Subversion хочет добавить / изменить много svn:mergeinfo
свойства к файлам, которые совершенно не связаны с вещами, которые я хочу объединить.
Вопросы об этом поведении уже задавались здесь, на переполнении стека:
- Свойства SVN Mergeinfo по путям, отличным от корня рабочей копии
- Есть ли способ отключить TortoiseSVN с помощью 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)
Преимущества этой команды:
- Он обрабатывает поддерево, но не корневой каталог;
- Обрабатывает скрытые («точечные») файлы;
- Он игнорирует файлы, которые не находятся под контролем версий.
PS. Команда может завершиться ошибкой, если вы зафиксировали файлы с пробелами (или другими необычными символами?) в именах в корневом каталоге.