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

136

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

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

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

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

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

LeonZandman
источник

Ответы:

142

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

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

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
Винсент
источник
57
Или просто не делайте этого в корневом каталоге "svn propdel -R svn: mergeinfo ./*"
JeremyWeir
3
«svn propdel -R svn: mergeinfo ./* ./.[^.]*», если у вас также есть «точка» / * ix скрытые файлы, вероятно, не проблема для пользователя Windows в этом вопросе.
Питер
3
подавление вывода ускоряет его: "svn propdel svn: mergeinfo -R> nul" (или> / dev / null в Linux)
bebbo
2
@JeremyWeir Что вы подразумеваете под «просто не делайте этого в корневом каталоге»? Откуда тогда? У вас есть много голосов против этого комментария, но я не вижу альтернативы.
ТТ.
3
@TT. Я думаю, что идея состоит в том, чтобы просто зайти в каталог, в котором есть вся запутанная информация о слиянии, и сделать это оттуда, чтобы вам не пришлось возвращать корневой каталог. Вы не хотите связываться с mergeinfo корня.
JeremyWeir
15

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

кельвин
источник
2
Работает с дефисами в файлах: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \." | вырезать "-d" -f1 | xargs svn propdel svn: mergeinfo
Белка
12

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

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

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

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

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

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

Ив Мартин
источник
2
Этот инструмент отлично подходит для консолидации свойств информации слияния, таких как виды, создаваемые с частичным слиянием подкаталогов, которые могут создать многие не совсем согласованные разработчики в большой команде. У инструмента, похоже, есть проблема с файлами, которые не существуют в каждой ветви, я получаю оставшиеся свойства слияния для файлов, указывающие ревизии ветвей, в которых файл никогда не существовал.
davenpcj
Я согласен, что это не идеально ... вот почему "человеческие проверки и контроль" все еще необходимы. В вашем случае, если вы определили несоответствующие ревизии в свойствах merge-info, вы можете удалить эти ревизии или все свойство svn: merge-info в этих файлах перед фиксацией. Пожалуйста, используйте GitHub, чтобы попросить улучшения.
Ив Мартин
4

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

moribvndvs
источник
Я был в такой же ситуации. Работал на меня. Спасибо!
andrewd18
2

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

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

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

Чейз Сейберт
источник
2
Спасибо, но, как вы, наверное, знаете, упомянув TortoiseSVN, я пользователь Windows и не использую оболочку Bash :-)
LeonZandman
То же самое должно быть возможно в DOS, хотя, вероятно, не так кратко.
Чейз Сейберт
1
Разве это не восстанавливает только файлы с измененной информацией mergeinfo в текущем рабочем каталоге? Если так, это не решает проблему: существующее явное mergeinfo. Для этого вам нужно будет пропдель.
Доминик Шейрлинк
2
Это довольно глючно - есть имя файла с пробелом в его имени? С глобусными символами в его названии? Плохие новости в любом случае. Одобренный / поддерживаемый способ анализа выходных данных состояния svn - использование --xmlфлага и анализатора XML; что-то еще может меняться между версиями, так как прямая совместимость в текстовом формате вывода не гарантируется.
Чарльз Даффи
2

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

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

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

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

Miral
источник
1

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

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

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

Тобиас
источник