'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
в конец конвейера, так как я видел, как там появляются дубликаты.Хотя я не понимаю, почему они произошли.