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

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

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

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

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

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


person LeonZandman    schedule 20.04.2009    source источник


Ответы (8)


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

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

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
person Vincent    schedule 15.04.2010
comment
Или просто не делайте этого в корневом каталоге svn propdel -R svn: mergeinfo ./* - person JeremyWeir; 18.02.2011
comment
svn propdel -R svn: mergeinfo ./* ./.[^.pting*, если у вас также есть скрытые файлы dot / * ix, вероятно, это не проблема для пользователя Windows в соответствии с вопросом. - person Peter; 08.11.2013
comment
подавление вывода ускоряет его: svn propdel svn: mergeinfo -R ›nul (или› / dev / null в Linux) - person bebbo; 20.05.2014
comment
@JeremyWeir Что вы имеете в виду, говоря просто не делайте этого в корневом каталоге? Откуда тогда? Вы получили много голосов за этот комментарий, но я не вижу альтернативы. - person TT.; 26.04.2016
comment
@TT. Я думаю, идея состоит в том, чтобы просто перейти в каталог, в котором есть вся испорченная информация о слиянии, и сделать это оттуда, чтобы вам не нужно было возвращать корневой каталог. Вы не хотите связываться с mergeinfo корня. - person JeremyWeir; 26.04.2016

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

person Kelvin    schedule 08.03.2010
comment
Работает с дефисами в файлах: svn propget -R svn: mergeinfo | grep -v ^ / | grep -v ^ \. | вырезать -d -f1 | xargs svn propdel svn: mergeinfo - person Squirrel; 29.04.2010

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

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

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

Вот он: svn-clean-mergeinfo

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

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

person Yves Martin    schedule 29.12.2012
comment
Этот инструмент отлично подходит для консолидации свойств информации о слиянии, таких как типы, созданные с помощью частичного слияния подкаталогов, которые могут создать многие не совсем скоординированные разработчики в большой команде. У инструмента, похоже, есть проблема с файлами, которые не существуют в каждой ветке, я получаю оставшиеся свойства информации о слиянии в файлах, указывающие на исправления в ветках, в которых файл никогда не существовал. - person davenpcj; 11.08.2015
comment
Я согласен, что это не идеально ... поэтому все еще требуются человеческие проверки и контроль. В вашем случае, если вы определили нерелевантные ревизии в свойствах merge-info, вы можете удалить эти ревизии или все свойство svn: merge-info в этих файлах перед фиксацией. Пожалуйста, используйте github, чтобы запросить улучшения. - person Yves Martin; 15.08.2015

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

person moribvndvs    schedule 24.03.2010
comment
Я был в такой же ситуации. Работал у меня. Спасибо! - person andrewd18; 16.11.2011

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

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

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

person Chase Seibert    schedule 14.08.2009
comment
Спасибо, но, как вы, возможно, знаете от моего упоминания TortoiseSVN, я пользователь Windows и не использую оболочку Bash :-) - person LeonZandman; 15.09.2009
comment
То же самое должно быть возможно в DOS, хотя, вероятно, не так кратко. - person Chase Seibert; 15.09.2009
comment
Разве при этом не восстанавливаются только файлы с измененной информацией о слиянии в текущем рабочем каталоге? Если это так, это не решает проблему: существующий явный файл mergeinfo. Для этого вам потребуется пропдел. - person Dominic Scheirlinck; 22.12.2009
comment
Это довольно глючно - иметь имя файла с пробелом в имени? В названии есть символы шара? В любом случае плохие новости. Утвержденный / поддерживаемый способ синтаксического анализа вывода svn status использует флаг --xml и синтаксический анализатор XML; все остальное может измениться между версиями, поскольку прямая совместимость с форматом текстового вывода не гарантируется. - person Charles Duffy; 15.08.2013

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

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

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

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

person Miral    schedule 25.01.2013

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

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

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

person Tobias    schedule 05.12.2011