Как заставить 'svn log' игнорировать изменения свойств? - PullRequest
6 голосов
/ 09 августа 2010

'svn log' показывает журнал: 1) файлы, содержание которых изменилось И / ИЛИ 2) файлы, свойства которых изменились.

Есть ли способ показать только файлы, к которым относится случай 1?

Ответы [ 5 ]

4 голосов
/ 18 августа 2010

'svn log' показывает журнал: 1) файлов, содержимое которых изменилось И / ИЛИ 2) файлов, свойства которых изменились.

Как вы знаете, вывод svn logорганизованный по сообщениям журнала фиксации, а не по файлам.Если вы используете подробный режим (-v), он покажет файлы («пути»), связанные с каждой записью журнала.Однако некоторые из этих путей могут быть за пределами запрошенной цели (по умолчанию: ваш текущий каталог).Хотите ли вы, чтобы результаты включали и эти внешние пути?Я полагаю, что если принять ваш вопрос за чистую монету, вы просто запрашиваете фильтрацию, так что да, вы хотели бы получить эти внешние пути, если они представляют изменение содержимого в файлах.

Вот решение.Это может быть медленно, но я протестировал его, и он работает в Cygwin на Windows 7. (Не забудьте, убедитесь, что ваши скрипты имеют unixy окончания строк! При необходимости с dos2unix)

Это действительно только одна длинная строка, за исключением внешнего сценария sed (который настоящий хакер мог бы поместить в командную строку, но у него не хватает жизни, чтобы избежать выхода из командной строки):

#!/bin/sh

# These paths are set up for cygwin
SED=/bin/sed
SORT=/bin/sort
UNIQ=/bin/uniq
XARGS=/bin/xargs
GREP=/bin/grep
SVN=svn

# Add desired log options here
LOG_OPTIONS=-v
SINCE_REV=10800
SED_SCRIPT=/cygdrive/c/temp/get-paths.sed
# Make sure you edit the sed script referenced above
# to set the base URL of your repository.

# 1) generate the list of log messages, including affected paths (svn log -v)
# 2) process out those paths (sed)
# 3) eliminate duplicates (sort | uniq)
# 4) get the change history for each of those paths (svn diff)
# 5) filter out the ones that involve only property changes (sed)
# 6) eliminate duplicates again (sort | uniq)
$SVN log $LOG_OPTIONS | $SED -n -f $SED_SCRIPT | $SORT | $UNIQ \
 | $XARGS -n20 -I PATHS $SVN diff -r $SINCE_REV --summarize PATHS 2> error.log \
 | $SED -n 's/^[^ ].... *//p' | $SORT | $UNIQ

Вот внешний сценарий sed.Обязательно измените базовый URL-адрес хранилища SVN на правильный базовый URL-адрес для вашего хранилища.Т.е. начальная часть URL-адреса svn, которая не выводится журналом svn -v.

 # sed script to output all lines between
 # /^Changed paths:$/ and /^$/, exclusive.
 # Also removes first 5 columns (status) and replaces them with svn repository base url.

 /^Changed paths:$/,/^$/ {
   /^Changed paths:$/b
   /^$/b
   s|^.....|https://svn.myrepo.org/prefix|
   s/ (from .*)$//
   p
}

Сценарий выведет некоторые сообщения об ошибках в error.log, в первую очередь «путь не найден», который, я считаю,для файлов, которые раньше присутствовали в репозитории, но были перемещены (переименованы) или удалены.

Соответствует ли это вашим требованиям?

Благодарим Майкла Августина на этой странице за идеи о том, как очистить вывод svn diff для удаления изменений только свойств.

PS Эта другая страница , кажется, задает тот же вопрос, но там нет полного ответа.

PPS Отредактировал приведенный выше скрипт bash, добавив дополнительный | sort | uniq в конец конвейера, так как я видел, как там появляются дубликаты.Хотя я не понимаю, почему они произошли.

2 голосов
/ 09 августа 2010

Не похоже на это: Журнал SVN в руководстве Subversion

Может быть, отфильтровать их потом, например, с помощью сценария оболочки?На какой системе вы работаете?

1 голос
/ 26 июня 2012

Как и вы, я был к сожалению удивлен, что 'svn log' нельзя было перечислить только ревизии, в которых изменилось содержимое файла.

Каждое из других предложений требовало чего-то, что я не установил, поэтому я создал версию, которая хорошо работает для моих нужд (запрашивает один файл) и требует только sh + awk. Поместите следующее в «svn-log-contents.sh»:

#!/bin/sh

while [ ! -z "$1" ]; do
   file="$1"
   base=`basename "$file"`
   echo "$base ($file)"
   shift
   svn log -v $file | \
      awk "/^r([1-9]+)/ { r=\$1 } /^ *[MAD] .*$base$/ { \
           system(\"svn log -l 1 -r \" r \" $file\") }"
done

Сделайте его исполняемым, используя 'chmod a + x svn-log-contents.sh', затем укажите имена файлов в командной строке:

./svn-log-contents.sh file.txt

Первое регулярное выражение (/ ^ r [1-9] /) захватывает каждый номер ревизии в переменной r. Следующее регулярное выражение ('/ ^ * [MAD] ... /') срабатывает только тогда, когда файл был существенно изменен, и в этот момент он запустит 'svn log' для этой одной ревизии. Я новичок, поэтому предложения приветствуются.

1 голос
/ 17 августа 2010

Еще до начала поиска я пришел к выводу, что для этого потребуется взять каждую ревизию в журнале и передать ее `svn diff ', чтобы увидеть, что именно изменилось в ревизии. Затем я нашел этот другой вопрос SO: как обнаружить измененные свойства с помощью журнала SVN

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

Надеюсь, это поможет.

Спасибо,
Zachary

0 голосов
/ 10 мая 2011

Вот способ показать журналы только для реальных изменений файла, игнорируя изменения свойства:

#!/bin/sh

for i in $(svn log --xml --with-no-revprops | xml sel -t -m "/log/logentry" -v "@revision" -o " "); do
    j=$(svn diff -c $i --summarize | grep -v "^ ")
    if [ -n "$j" ]; then
        svn log -c $i
    fi
done

Вышесказанное требует установки xmlstarlet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...