Как я могу просмотреть все исторические изменения файла в SVN


169

Я знаю, что могу svn diff -r a:b repo просматривать изменения между двумя указанными ревизиями. То, что я хотел бы, является diff для каждой ревизии, которая изменила файл. Доступна ли такая команда?


16
Это скрыто в странно названной команде "вины".
Гусманжак

6
Я думал, что @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
    }
}

Затем вы можете позвонить с помощью:

history_of_file $1

35
Я никогда раньше не видел этот трюк с "обвязкой". Ухоженная.

5
Пакетная версия этого скрипта, fwiw.
ladenedge

Я добавил это в мой файл .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. это не часть определения функции, это вызов функции, поскольку данный пример предназначен для использования в качестве автономного скрипта.
Бендин

26
svn log --diff [path_to_file]работает именно так! stackoverflow.com/a/24938573/3185510
веб-сайт

143

Немного отличается от того, что вы описали, но я думаю, что это может быть тем, что вам действительно нужно:

svn blame filename

Он напечатает файл с каждой строкой с префиксом, указанным временем и автором коммита, который последним изменил его.


4
Вау это здорово! Я использовал SVN в течение многих лет и никогда не знал об этом: O
Да, Барри

4
Вам может понадобиться опция verbose / -v, чтобы увидеть метку времени (я использую мою стандартную сборку svn 1.7.9).
Уэстон С

Мой профессор написал начальный плагин обвинения в SVN. Я должен был искать это до сих пор. Он полностью выполняет свое задание. : P
Джозеф Дейли

93

Если вы хотите увидеть всю историю файла с изменениями кода:

svn log --diff [path_to_file] > log.txt

3
Я не знаю, когда была добавлена ​​опция --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.


27
Установить 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.


4
или ... продолжай! 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

Это делает команда со странным названием «вина». Если вы используете Черепаху, она дает вам диалоговое окно «от редакции», затем список файлов с построчным индикатором номера редакции и автора рядом с ним.

Если щелкнуть правой кнопкой мыши информацию о ревизии, вы можете вызвать диалоговое окно «Показать журнал», в котором содержится полная информация о регистрации, а также другие файлы, которые были частью регистрации.


1
Это очень полезно, но не то, что искал ОП, то есть полная история файла, а не только исторический вклад текущего файла. Эта полная история полезна, когда вы оглядываетесь назад, чтобы выяснить, почему и когда определенный код был удален или изменен.
Адам Толли

Наоборот, название вполне правильное. Он говорит вам, кого винить за определенный (дрянной / глючный / непонятный) кусок кода.
ivan_pozdeev

Разве не было бы хорошо, если бы очевидное название команды было «кредит», а не «вина»? :)
Ник

1
@Nick svn похвала является псевдонимом svn вины, в зависимости от того, как вы чувствуете.
stefgosselin

@stefgosselin - Спасибо за эту заметку. Я рад, что есть выбор! :)
Ник

3

Насколько я знаю, нет встроенной команды SVN для этого. Вам нужно написать скрипт для запуска нескольких команд для построения всех различий. Более простой подход состоит в том, чтобы использовать svn-клиент с графическим интерфейсом, если это вариант. Многие из них, такие как подрывной плагин для Eclipse, будут перечислять историю файла, а также позволят вам просматривать различия каждой ревизии.


3

Спасибо, Бендин. Мне очень нравится ваше решение.

Я изменил его, чтобы он работал в обратном порядке, сначала показывая самые последние изменения. Что важно с давним кодом, поддерживаемым в течение нескольких лет. Я обычно делаю это на большее.

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

0

Я видел кучу частичных ответов при исследовании этой темы. Это то, что сработало для меня, и надеюсь, что это поможет другим. Эта команда отображает вывод в командной строке, показывая номер редакции, автора, метку времени редакции и внесенные изменения:

svn blame -v <filename>

Чтобы упростить поиск, вы можете записать вывод в файл и выполнить поиск по запросу.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.