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


169

Я знаю, що можу svn diff -r a:b repo переглянути зміни між двома вказаними версіями. Що мені хотілося б - це різниця для кожної редакції, яка змінила файл. Чи доступна така команда?


16
Це приховано у дивно названій команді "винуватий".
goosemanjack

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
webster

143

Трохи відрізняється від описаного вами, але я думаю, що це насправді вам потрібно:

svn blame filename

Він надрукує файл із кожним рядком з префіксом часу та автором комітету, який останній його змінив.


4
Whoa це дивовижно! Використовував 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
Гійом Грос

1
Я думаю, svn 1.7.4 ввів варіант, --diffоскільки він має тести для параметра, тоді як у 1.7.3 немає жодного - subversion/tests/cmdline/log_tests.py.
дійсна

Лише невелика примітка: залежно від тривалості історії, це може зайняти досить багато часу, перш ніж файл log.txt буде повністю виведений (хоча він буде прочитаний негайно).
Іван Дерст

1
Як обмежити це останньою редакцією X?
Енігма

@Enigma: з --limit <number>опцією. Як так:svn log --diff --limit 5 [path_to_file]
Рейд

37

Ви можете використовувати git-svnдля імпорту сховища в сховище Git, а потім використовувати git log -p filename. Це показує кожен запис журналу для файлу, а потім відповідний розл.


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приємний маленький
однолінійний

8

Як це дивно називається команда "винуватий". Якщо ви використовуєте "Черепаха", він відкриє діалогове вікно "з перегляду", а потім список файлів із рядковим рядком за номером редакції та автором поруч.

Якщо ви клацніть правою кнопкою миші на інформацію про версію, ви можете відкрити діалогове вікно "Показати журнал", яке дає повну інформацію про реєстрацію, а також інші файли, що входили до складу реєстрації.


1
Це дуже корисно, але не те, що шукала ОП, це повна історія файлу, а не лише історичний внесок поточного файлу. Ця повна історія корисна при огляді назад, щоб з’ясувати, чому певний код було видалено або змінено, і коли.
Адам Толлі

Навпаки, назва цілком правильна. Це говорить вам, кого звинувачувати в певному (хитромудрі / баггі / незрозумілому) фрагменті коду.
ivan_pozdeev

Чи не було б добре, якби очевидна назва команди була "кредит", а не "звинувачення"? :)
Нік

1
@Nick svn похвала - це псевдонім, щоб звинувачувати svn, залежно від того, як ви себе почуваєте.
stefgosselin

@stefgosselin - Дякую за цю замітку. Я рада знати, що є вибір! :)
Нік

3

Наскільки я знаю, немає вбудованої команди svn для цього. Вам потрібно буде написати сценарій для запуску декількох команд для складання всіх розрізків. Більш простим підходом було б використання клієнтського GUI-клієнта, якщо це варіант. Багато з них, такі як підривний плагін для 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.