Ответ 1
Вот еще один способ удалить все свойства svn: mergeinfo, но не в корневую папку (это необходимо для правильной работы ветвления).
Из корня проекта выполните:
svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
Когда я объединяю вещи в моем репозитории, Subversion хочет добавить/изменить много свойств svn:mergeinfo
к файлам, которые полностью не связаны с вещами, которые я хочу объединить.
Вопросы об этом поведении были заданы здесь в разделе "Переполнение стека":
Из того, что я понимаю из упомянутых выше тем, похоже, что у большого количества файлов в моем репозитории есть явные свойства svn:mergeinfo
на них, когда они не должны. Совет состоит в том, чтобы уменьшить количество и только поместить эти свойства в соответствующие файлы/папки.
Итак, теперь мой вопрос: как я могу легко удалить те ненужные свойства? Я использую TortoiseSVN, но я не хочу вручную проверять/исправлять сотни файлов. Есть ли более простой способ удалить ненужные свойства svn:mergeinfo
?
P.S. Я не ищет код API SVN С++.
Вот еще один способ удалить все свойства 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.
Как упоминалось в этот поток:
Как я не уверен в исключении свойств blind svn:merge-info
, я внедрил инструмент для анализа текущей ситуации на рабочей копии и удалил как можно больше изменений слияния из свойств non-root merge-info. После дополнительных проверок и элементов управления, изменения в рабочей копии могут быть зафиксированы.
Вот он: svn-clean-mergeinfo
Не стесняйтесь сообщать о какой-либо проблеме его использования, чтобы улучшить его.
Subversion 1.10 представляет новый инструмент, посвященный этой задаче: svn-mergeinfo-normalizer
Если вы уверены, что хотите массово удалить свойства mergeinfo, вы можете использовать следующие BASH script.
FILES=`svn status |grep "^ M " |sed s/" M "// |tr '\n', ' '`
svn revert $FILES
Он получает список измененных файлов, фильтрует его только для изменения только mergeinfo, разбивает все, кроме фактического пути к файлу, преобразует однострочные пути в список с разделителями пробелов, а вызовы возвращаются в этот список.
Я знаю, что это было какое-то время, но у меня возникла аналогичная проблема. Я использую TortoiseSVN 1.6.7. Так получилось, что собственность была в корне моей рабочей копии. Когда я просмотрел свойства в корне и нажал "Удалить" на svn: mergeinfo, он спросил меня, хочу ли я удалить его рекурсивно. Это избавило меня от всех моих svn: mergeinfo cockups.
Вместо того, чтобы просто слепо удалять свойства mergeinfo, также возможно завершить "отсутствующие" слияния.
Скопируйте свойство mergeinfo из корневой папки и затем выполните слияние в дочерней папке для соответствующего относительного пути и одного и того же списка изменений. (Вы можете, но не нужно, только перечислять различия между этим списком и тем, который уже находится в дочерней папке.)
Обычно это слияние должно привести только к изменению свойств mergeinfo, а не к фактическим файлам. (Если он в конечном итоге меняет файлы, то одно из предыдущих слияний должно быть только частичным слиянием, которое, возможно, вызывало у вас проблемы).
Выполнение этого должно привести к удалению свойства mergeinfo для вас, как только вы получите их обоих, чтобы точно соответствовать. Вам также может понадобиться сделать обратное: объединить в корень любые изменения слияния, только присутствующие в дочерней папке (опять же, вы можете просто вставить полный список и позволить SVN разобраться в обнаружении различий для вас).
Чтобы внести изменения в структуру каталогов, это будет (только не 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, который может удалить явно избыточную информацию о слиянии и рассказать о других отличиях...