Історія змін певного рядка коду в Subversion


78

Чи можна побачити історію змін до певного рядка коду у сховищі Subversion?

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

Відповіді:


55

Я не знаю методу відстеження висловлювань у часі в Subversion.

Однак просто побачити, коли будь-який конкретний рядок у файлі востаннє змінювався за допомогою svn blame. Перевірте SVNBook: svn blameпосилання :

Конспект

svn blame TARGET[@REV]...

Опис

Показати інформацію про автора та редакцію в рядку для вказаних файлів або URL-адрес. Кожен рядок тексту на початку коментується автором (ім'я користувача) та номером редакції останньої зміни цього рядка.


2
Ви вирішили проблему OP, але мені все ще цікаво, чи є спосіб простежити історію для певного рядка - коли занадто багато рядків і занадто багато версій, щоб переглядати їх вручну.
JohnK

1
Багато інструментів графічного інтерфейсу, наприклад, tortoiseSVN (на вікнах), добре роблять роботу, спираючись на цю функціональність, щоб дозволити вам ходити по історії. Зазвичай виділяють будь-які сусідні рядки, які змінилися разом, і полегшують вхід у цю різницю, потім вибирають відповідний номер рядка з попередньої версії та повторюють. Я щасливо і швидко простежив великі репозиторії (вік> 10 років), які включали міграції з CVS і навіть вирізання та вставлення клонування сховища як частину історії. Для більшої автоматизації, можливо, ви можете імпортувати репо в git і скористатися його вдосконаленою можливістю звинувачення на основі вмісту.
morechilli

46

У клієнті TortoiseSVN є дуже приємна функція, яка дозволяє:

  • звинувачувати файл, відображаючи останню зміну для кожного рядка (це стандартно)
  • "звинуватити попередню редакцію", після натискання на певний рядок у наведеному вище поданні (це хороший)

Друга функція виконує те, що сказано - вона показує анотовану редакцію, що передувала останній зміні рядка. Повторно використовуючи цю функцію, ви можете прослідкувати історію певного рядка.


що, якщо провина не показує межі? У мене є випадок, що я шукаю зміну певного рядка. Використана черепаха-> звинувачення Нехай перегляд пізніше переглядається. У файлі я бачу певний рядок, звинувачуючи, я не можу його знайти.
Offler

13

Я зазвичай:

  1. Біжи svn blame FILEспочатку.
  2. Зверніть увагу на останню редакцію конкретного рядка.
  3. Зробіть ще один запит з -rаргументом:

    svn blame FILE -r 1:REV
    
  4. Простежте вручну звідти.

Ви можете отримати 1. та 2. у поєднанніsvn annotate $file_path | head -n$line_no | tail -1 | awk '{print $1}'
hardmooth

5

Це можна зробити в два етапи:

  1. svn blame /path/to/your/file > blame.tmp
  2. grep "your_line_of_text" blame.tmp

Потім ви можете видалити файл .tmp, якщо він вам не потрібен.

В принципі, простий сценарій може бути написаний будь-якою мовою сценаріїв, яка виконує приблизно те саме.


Не потрібно цього робити. Це можна зробити з самого редактора, наприклад, я використовую VCSAnnotate від vim. і він розділяється і показує висновок про вину, не виходячи з редактора vim. Інші редактори також мають подібні плагіни
KeshV

2

Ключовим тут є те, скільки потрібно історії. Як зазначали інші, коротка відповідь така: svn blame(дивsvn help blame Докладніше). Якщо ви сягаєте далеко в історію або маєте справу зі значними змінами, вам, ймовірно, знадобиться не лише ця одна команда.

Мені просто довелося це зробити самому, і я знайшов цю (ви оле) нитку тут на SO. Ось що я зробив, щоб вирішити це лише CLI, особливо для мого випадку, коли API змінився (наприклад, під час перенесення чиєїсь застарілої роботи (не на гілці, arrgh! ) Назад у гілку функції, засновану на останніх версіях стовбур дати). Наприклад, імена функцій досить змінилися, де не було очевидно, яку функцію потрібно викликати.

Крок перший

Наступна команда дозволила мені переглядати коміти, де щось змінилося у файлі "fileName.h", і бачити відповідний номер редакції (примітка: можливо, вам доведеться змінити "10" для більш-менш контексту відповідно до вашого тексту журналу svn ).

svn log | grep -C 10 "fileName.h" | less

У результаті з’являється список версій, у яких цей файл було змінено.

Крок другий

Тоді справа була простою у використанні blame(або, як зазначали інші annotate), для звуження до перегляду інтересів.

cd trunk
svn blame fileName.h@r35948 | less

Наприклад, встановлено, що перегляд відсотків становив 35948.

Крок третій

Визначивши перегляд (и), що представляє інтерес, через звинувачення, можна створити різницю для використання інструмента SVN.

svn diff -r35948:PREV fileName.h

Висновок

Наявність візуальної різниці значно полегшило ідентифікацію старих імен API з новими / оновленими іменами API.


У моєму конкретному сценарії, якщо вам пощастить і ви працюєте з кодом, який має хороші повідомлення про коміти в журналі, ви навіть зможете grepвикористати старе ім'я API / функції та знайти коментар, що говорить щось на зразок " змінено func_FindParm на func_GetParm " .
tniles

2

В Eclipse , ви можете знати , коли кожен рядок коду було скоєно з допомогою уявлення аннотирования SVN, або правою кнопкою миші на файлі → КомандаПоказати анотацію ... .



0

svn kriv показує, яка реєстрація змінила будь-який рядок у файлі востаннє.

Це працює і на старих версіях.


0

Початок - це команда svn вини (або анотування, похвала). Він покаже вам, коли рядок коду востаннє був змінений і ким він був змінений. наприклад:

  4564    wiemann # $Id$
  4564    wiemann # Author: David Goodger <goodger@python.org>
   778    goodger # Copyright: This module has been placed in the public domain.
   217    goodger 

0

Якщо ви використовуєте Emacs, це vcможе зробити вбудований пакет .

  1. Перейдіть до відповідного файлу.
  2. Запустіть команду vc-annotateза допомогою M-x vc-annotateабоC-xvg .
  3. Кожен рядок відображатиметься зі своїм переглядом, як звичайний svn blame.
  4. Натискання a( vc-annotate-revision-previous-to-line) призведе до перегляду перед редакцією на рядку, на якому ви знаходитесь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.