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

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

9 ответов

Решение

Для него нет встроенной команды, поэтому обычно я делаю что-то вроде этого:

#!/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

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

svn blame filename

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

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

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

Вы могли бы использовать git-svn чтобы импортировать репозиторий в репозиторий Git, затем используйте git log -p filename, Здесь показана каждая запись в журнале для файла, за которой следует соответствующий diff.

Начать с

svn log -q file | grep '^r' | cut -f1 -d' '

Это даст вам список ревизий, в которых файл был изменен, который вы затем сможете использовать для сценария повторных вызовов svn diff,

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

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

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

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

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

svnhistory elements.py |more

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

#!/bin/bash                                                                    

# history_of_file                                                              
#                                                                              
# Bendin on Stack Overflow: http://stackru.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>

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

Другие вопросы по тегам