Я использую SVN в качестве системы управления версиями, и мне интересно, как сравнивать каталоги, игнорируя любые различия в метаданных. Есть ли способ указать svn diff сравнивать только фактическое содержимое и игнорировать любые метаданные?
Я имею в виду такие метаданные, как свойства SVN и т. д., Которые не влияют на содержимое файла. Предположим, что файл X имеет дополнительное свойство в ветви B по сравнению с стволом T. К сожалению, он будет отображаться в 'svn diff T B', даже если фактическое содержимое файла X такое же.
Ищу что-то вроде этого:
svn diff https://example.org/tags/v1 https://example.org/tags/v2 -x -ignore-metadata --summarize
Обновлять: Я частично решил эту проблему, проводя различие непосредственно в файловой системе вместо использования инструментов SVN. Смотрите мой ответ ниже ...
"Свойства SVN" - лучшее слово для описания этого. Я исправил свой пост, чтобы прояснить это ..





Я не уверен, но простой svn diff | grep -iv "материал, который следует игнорировать" 'было бы обходным путем.
Вся разница состоит только из огромного количества текста, мне пришлось бы вручную проанализировать его, чтобы отфильтровать все изменения, подобные «svn property added». К сожалению, с помощью grep я не могу выполнить простую задачу.
Вы можете установить свойство svn: игнорировать для файлов и каталогов, которые svn diff игнорирует.
Я не хочу игнорировать определенные каталоги или файлы, это касается игнорирования различных свойств (также называемых метаданными) одних и тех же файлов. Предположим, что файл X имеет дополнительное свойство в ветви B по сравнению с стволом T. Он будет отображаться в svn diff, даже если фактическое содержимое такое же.
Кажется, нет способа сделать это с помощью встроенных инструментов svn. Как я это решил: Экспортируйте оба дерева и напрямую сравнивайте их в файловой системе с помощью вашего любимого инструмента сравнения. Каким-то образом это единственный способ сделать это: /
Если вы используете опцию --summarize, то изменения свойств указываются во втором, а не в первом столбце.
Т.е.,
M URL -- indicates content change
M URL -- property change
MM URL -- content and property change
С grep немного проще. Я предполагаю, что у вас может быть двухэтапный процесс, если вы хотите получить полное сравнение - сначала используйте summarize, чтобы найти файлы с измененным содержимым, а затем сравните их.
Хороший совет от Джозефа Уоткинса.
Вот команда для пользователей grep-junior:
svn diff A B --summarize | grep '^. '
Команда grep ищет пробел в качестве второго символа в строке.
Простите. Это должно быть svn diff A B --summarize | grep -v '^' Все строки, начинающиеся с пробела, должны быть скрыты, потому что там, где изменяются только свойства файлов.
Это не касается случаев, когда оба свойства а также содержимого файла изменяются или когда с файлом произошло что-то еще, например блокировка, и файл был изменен.
Я написал сценарий для этого после того, как не смог найти его в Интернете.
Скрипт удаляет данные на основе массива регулярных выражений, введенных в верхней части скрипта. В настоящее время он настроен для фильтрации изменений свойств, но может удалить любое изменение, которое соответствует ряду регулярных выражений.
Просто направьте вывод svn diff в скрипт после того, как вы установите скрипт. Я помещаю фильтры в сценарий вместо параметров, потому что всегда использую одни и те же фильтры.
Я выпустил его как GPLv2.
Вы можете передать вывод svn diff через filterdiff --clean, чтобы удалить любые посторонние строки, включая изменения свойств.
Работает как рекламируется - отлично! Подсказка для пользователей Debian / Ubuntu: если filterdiff отсутствует в вашей системе, вы можете установить его через apt-get install patchutils.
Более новые версии svn (проверенные на 1.9.3) предоставляют встроенный способ сделать это: stackoverflow.com/a/50515644/5749914 или stackoverflow.com/a/18984711/5749914.
Вот одна команда, которая все это делает. Предположим, вы хотите найти все различия (не относящиеся к свойствам) для всех файлов в текущем каталоге между ревизиями 54833 и 57215. Эта команда должна сделать это:
svn diff -r 54833:57215 --summarize | egrep -v '^ |^D|^A' | awk '{ print $2 }' | xargs svn diff -r 54833:57215
NB: он сравнивает только измененные файлы, а не добавленные или удаленные файлы.
Нашел это при поиске в справочной документации svn
svn diff --patch-compatible
Это то же самое, что и бег
svn diff --show-copies-as-adds --ignore-properties
Используйте svn diff --ignore-properties. Это встроенный в Subversion метод, позволяющий различать только контент. Он игнорирует любые изменения свойств элементов.
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением. - Из обзора
Не так ли? Вопрос автора заключался в том, как заставить svn diff игнорировать все свойства Subversion при выполнении сравнения. Именно это и делает svn --ignore-properties. Может, мне следовало сформулировать это лучше в качестве ответа. Я постараюсь сделать это в будущем.
@ryadavilli, почему рецензенты stackoverflow такие тупые?
Что вы имеете в виду под метаданными?