Как я могу просмотреть все исторические изменения файла в SVN
169
Я знаю, что могу svn diff -r a:b repo просматривать изменения между двумя указанными ревизиями. То, что я хотел бы, является diff для каждой ревизии, которая изменила файл. Доступна ли такая команда?
Я думал, что @goosemanjack пошутил, пока не попробовал.
SSH Это
Ответы:
181
Для него нет встроенной команды, поэтому обычно я делаю что-то вроде этого:
#!/bin/bash
# history_of_file
#
# Outputs the full history of a given file as a sequence of
# logentry/diff pairs. The first revision of the file is emitted as
# full text since there's not previous version to compare it to.
function history_of_file() {
url=$1 # current url of file
svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -n | {
# first revision as full text
echo
read r
svn log -r$r $url@HEAD
svn cat -r$r $url@HEAD
echo
# remaining revisions as differences to previous revision
while read r
do
echo
svn log -r$r $url@HEAD
svn diff -c$r $url@HEAD
echo
done
}
}
Я добавил это в мой файл .bashrc. Когда я начинаю, я получаю svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0
1
@ Francisco0: не включайте последнюю строку в ваш bashrc. это не часть определения функции, это вызов функции, поскольку данный пример предназначен для использования в качестве автономного скрипта.
Я не знаю, когда была добавлена опция --diff, но она работает с SVN 1.8.10, поэтому нет необходимости в bash-скрипте
Guillaume Gros
1
Я думаю, что в svn 1.7.4 была введена опция, --diffтак как она имеет тесты для опции, а в 1.7.3 нет - subversion/tests/cmdline/log_tests.py.
действует
Небольшое примечание: в зависимости от длины истории, может пройти довольно много времени, прежде чем файл log.txt будет полностью отрисован (хотя он сразу станет читаемым).
Иван Дерст
1
Как можно ограничить это самыми последними ревизиями X?
Enigma
@ Enigma: с --limit <number>возможностью. Вот так:svn log --diff --limit 5 [path_to_file]
Рейд
37
Вы можете использовать git-svnдля импорта репозитория в Git-репозиторий, а затем использовать git log -p filename. Здесь показана каждая запись в журнале для файла, за которой следует соответствующий diff.
Установить git, создать репозиторий git, использовать команду git? Вопрос был помечен и задан о Subversion.
Кен Джентл
21
Я использую git в качестве клиента Subversion с git-svn. Вот как я могу выполнить операцию log + diff для хранилища Subversion. У Git есть действительно отличные инструменты для просмотра репозитория, это не такая странная идея.
Грег Хьюгилл
10
Над кем-то (справедливо) поздравляют с написанием хорошего сценария - для обеспечения функциональности, отсутствующей в SVN. Видя, что git является локальным, если вы не нажмете, вы можете вызвать этот инструмент, не нужно расстраиваться из-за вещей.
Адам Толи
Это также единственный ответ, который позволяет вам использовать графический интерфейс (по выбору) для просмотра истории файла. Другие ответы также не объяснили, как ограничиться последними X ревизиями (возможно вообще?), Что легко сделать в git. git log X..Y -o filename
TamaMcGlinn
21
Начать с
svn log -q file | grep '^r' | cut -f1 -d' '
Это даст вам список ревизий, в которых файл был изменен, который вы затем сможете использовать для сценария повторных вызовов svn diff.
или ... продолжай! svn log -q some_file.xxx | grep ^r | awk '{print $1}' | sed -e 's/^r//' | xargs -i svn diff -rHEAD:{} some_file.xxx > ~/file_history.txtхороший маленький однострочный (awk делает то же самое, что вырезать)
Kasapo
8
Это делает команда со странным названием «вина». Если вы используете Черепаху, она дает вам диалоговое окно «от редакции», затем список файлов с построчным индикатором номера редакции и автора рядом с ним.
Если щелкнуть правой кнопкой мыши информацию о ревизии, вы можете вызвать диалоговое окно «Показать журнал», в котором содержится полная информация о регистрации, а также другие файлы, которые были частью регистрации.
Это очень полезно, но не то, что искал ОП, то есть полная история файла, а не только исторический вклад текущего файла. Эта полная история полезна, когда вы оглядываетесь назад, чтобы выяснить, почему и когда определенный код был удален или изменен.
Адам Толли
Наоборот, название вполне правильное. Он говорит вам, кого винить за определенный (дрянной / глючный / непонятный) кусок кода.
ivan_pozdeev
Разве не было бы хорошо, если бы очевидное название команды было «кредит», а не «вина»? :)
Ник
1
@Nick svn похвала является псевдонимом svn вины, в зависимости от того, как вы чувствуете.
stefgosselin
@stefgosselin - Спасибо за эту заметку. Я рад, что есть выбор! :)
Ник
3
Насколько я знаю, нет встроенной команды SVN для этого. Вам нужно написать скрипт для запуска нескольких команд для построения всех различий. Более простой подход состоит в том, чтобы использовать svn-клиент с графическим интерфейсом, если это вариант. Многие из них, такие как подрывной плагин для Eclipse, будут перечислять историю файла, а также позволят вам просматривать различия каждой ревизии.
Я изменил его, чтобы он работал в обратном порядке, сначала показывая самые последние изменения. Что важно с давним кодом, поддерживаемым в течение нескольких лет. Я обычно делаю это на большее.
svnhistory elements.py |more
Я добавил -r в сортировку. Я удалил спец. обработка для «первой записи». Это будет ошибка на последней записи, так как нет ничего, чтобы разобраться с этим. Хотя я живу с этим, потому что я никогда не спускаюсь так далеко.
#!/bin/bash
# history_of_file
#
# Bendin on Stack Overflow: http://stackoverflow.com/questions/282802
# Outputs the full history of a given file as a sequence of
# logentry/diff pairs. The first revision of the file is emitted as
# full text since there's not previous version to compare it to.
#
# Dlink
# Made to work in reverse order
function history_of_file() {
url=$1 # current url of file
svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -nr | {
while read r
do
echo
svn log -r$r $url@HEAD
svn diff -c$r $url@HEAD
echo
done
}
}
history_of_file $1
Я видел кучу частичных ответов при исследовании этой темы. Это то, что сработало для меня, и надеюсь, что это поможет другим. Эта команда отображает вывод в командной строке, показывая номер редакции, автора, метку времени редакции и внесенные изменения:
svn blame -v <filename>
Чтобы упростить поиск, вы можете записать вывод в файл и выполнить поиск по запросу.
Ответы:
Для него нет встроенной команды, поэтому обычно я делаю что-то вроде этого:
Затем вы можете позвонить с помощью:
источник
svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
svn log --diff [path_to_file]
работает именно так! stackoverflow.com/a/24938573/3185510Немного отличается от того, что вы описали, но я думаю, что это может быть тем, что вам действительно нужно:
Он напечатает файл с каждой строкой с префиксом, указанным временем и автором коммита, который последним изменил его.
источник
Если вы хотите увидеть всю историю файла с изменениями кода:
источник
--diff
так как она имеет тесты для опции, а в 1.7.3 нет -subversion/tests/cmdline/log_tests.py
.--limit <number>
возможностью. Вот так:svn log --diff --limit 5 [path_to_file]
Вы можете использовать
git-svn
для импорта репозитория в Git-репозиторий, а затем использоватьgit log -p filename
. Здесь показана каждая запись в журнале для файла, за которой следует соответствующий diff.источник
git log X..Y -o filename
Начать с
Это даст вам список ревизий, в которых файл был изменен, который вы затем сможете использовать для сценария повторных вызовов
svn diff
.источник
svn log -q some_file.xxx | grep ^r | awk '{print $1}' | sed -e 's/^r//' | xargs -i svn diff -rHEAD:{} some_file.xxx > ~/file_history.txt
хороший маленький однострочный (awk делает то же самое, что вырезать)Это делает команда со странным названием «вина». Если вы используете Черепаху, она дает вам диалоговое окно «от редакции», затем список файлов с построчным индикатором номера редакции и автора рядом с ним.
Если щелкнуть правой кнопкой мыши информацию о ревизии, вы можете вызвать диалоговое окно «Показать журнал», в котором содержится полная информация о регистрации, а также другие файлы, которые были частью регистрации.
источник
Насколько я знаю, нет встроенной команды SVN для этого. Вам нужно написать скрипт для запуска нескольких команд для построения всех различий. Более простой подход состоит в том, чтобы использовать svn-клиент с графическим интерфейсом, если это вариант. Многие из них, такие как подрывной плагин для Eclipse, будут перечислять историю файла, а также позволят вам просматривать различия каждой ревизии.
источник
Спасибо, Бендин. Мне очень нравится ваше решение.
Я изменил его, чтобы он работал в обратном порядке, сначала показывая самые последние изменения. Что важно с давним кодом, поддерживаемым в течение нескольких лет. Я обычно делаю это на большее.
Я добавил -r в сортировку. Я удалил спец. обработка для «первой записи». Это будет ошибка на последней записи, так как нет ничего, чтобы разобраться с этим. Хотя я живу с этим, потому что я никогда не спускаюсь так далеко.
источник
Я видел кучу частичных ответов при исследовании этой темы. Это то, что сработало для меня, и надеюсь, что это поможет другим. Эта команда отображает вывод в командной строке, показывая номер редакции, автора, метку времени редакции и внесенные изменения:
Чтобы упростить поиск, вы можете записать вывод в файл и выполнить поиск по запросу.
источник