2010-08-09 2 views
6

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

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

+0

Возможный дубликат [Есть ли фильтр исключения метаданных для команды SVN DIFF?] (Http://stackoverflow.com/questions/402522/is-there-a-metadata-exclusion-filter-for-the-svn -diff-command) –

+0

@Pekka Я не нашел там никакого решения, которое применимо здесь. Проблемы могут напоминать, но не дублировать. –

+0

@zr Извините. Я упустил из виду другой вопрос. Однако, не ввела ли простая конструкция grep туда в правильном направлении? –

ответ

4

'журнала Svn' показывает журнал: 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 

Вот внешний СЭД сценарий. Обязательно измените базовый URL-адрес репозитория svn на правильный базовый URL-адрес вашего репозитория. То есть начальную часть URL-адреса svn, которая не выводится с помощью svn log -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, в первую очередь «Путь не найден», который я считаю, для файлов, которые используются, чтобы присутствовать в хранилище, но были перемещены (переименованы) или удалены.

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

Кредит Майклу Августину в this page за идеи о grepping вывод svn diff для удаления изменений свойств.

P.S. This other page, похоже, задает тот же вопрос, но ответа нет.

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

+0

P.S. Я новичок в SO, и меня интересует щедрость, поэтому, если вы думаете, что это отвечает на ваш вопрос, пожалуйста, проследите. И если кто-то еще думает, что он хорошо отвечает на вопрос, пожалуйста, проголосуйте ... в ближайшие пару часов. :-) – LarsH

+0

+1! @LarsH: это одна из неприятных вещей SO: система вознаграждения. Идея хорошая, и многие жалуются на функцию автоматического увольнения, но она все еще там. Я часто видел, как мои ответы игнорировались или проверялись как ответы после окончания периода награды. И посмотрите, здесь тоже слишком поздно, чтобы щедрость была выиграна ... (PS: см. Некоторые обсуждения на meta.stackoverflow.com) – Abel

+0

@ Абель, да ... Я потратил немного времени на то, что , и опубликовал несколько часов до крайнего срока. Более того @zr был в сети. Но, вероятно, занят другим вопросом. Так спасибо за голосование. Я добрался до разумного порога теперь для репутации, поэтому потеря щедрости не так критична. – LarsH

2

Не похож на это: SVN log in the Subversion manual

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

+0

Да. Я считаю, что это требует написания сценария пост-обработки. Я надеялся, что кто-то захочет поделиться существующим решением, вместо того, чтобы изобретать колесо. –

+0

@zr, что чрезвычайно сложно сделать, когда вы даже не обнаруживаете операционную систему, в которой вам нужно это, чтобы работать. Вы должны добавить эту информацию. –

+0

Я использую как Windows, так и Linux. В Windows у меня Cygwin взаимодействует с моей оболочкой, поэтому решение на основе unix должно работать на обеих платформах. –

1

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

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

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

Спасибо,
Захари

0

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

#!/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 быть установлен.

1

Как и вы, я был с грустью удивлен, что «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 а + х svn-log-contents.sh», а затем поставить имя (ы) файла по команде линия:

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

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