Повернення одного файлу в SVN до певної версії


182

У мене є файл, як показано нижче, у репортажі SVN, який я хочу повернути до попередньої версії. Який спосіб це зробити у SVN? Я хочу лише перенести цей конкретний файл на більш стару версію, а не на весь репо.

Дякую.

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial

коли ти сказав скасувати, що ти мав на увазі, 7 років тому,
— хаха

Відповіді:


181

Якщо ви просто хочете старий файл у вашій робочій копії:

svn up -r 147 myfile.py

Якщо ви хочете відкатати, див. Це " Як повернутися до старішої версії нашого коду в підривному режимі? ".


8
але наступного разу, коли ви оновите, він отримує файл, який ви не хотіли назад ...: S
— andygoestohollywood

2
якщо ви не хочете його назад, svn вчинити цей файл, щоб помістити потрібну версію в репо
— Packet Tracer

14
Це, мабуть, насправді не робить того, чого хотів задати запитання. Використовуючи це, робоча копія чиста і не може бути виконана, ЯК Є, а "SVN-оновлення" без вказаного номера версії отримає останню, небажану версію.
— CXJ

1
Яким чином я можу вчинити повернутий файл тоді?
— marcio

2
Це не зовсім правильно, оскільки, як зазначає CXJ, немає способу зафіксувати оновлений файл. Ви, мабуть, хочете зробити так, як каже Мітч Демпсі (зауважте, однак
— примушуйте

76

svn cat теж переглядає аргументи!

svn cat -r 175 mydir/myfile > mydir/myfile


20
Це, безумовно, найкраща відповідь на сторінці. Він залишає змінений файл у стані, який може бути здійснено.
— dotancohen

Схоже, це не спрацює, коли ви вставляєте новий файл
— ahnbizcad

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

Це просто і просто, коли ви просто хочете скасувати зміни та повернути файл у стан попереднього введення без будь-яких технічних засобів контролю версій.
— Анонім

57
svn revert filename 

це має відновити один файл.


4
Що з усіма іншими відповідями з довшими командами? Дякую.
— masterxilo

Будь ласка. Я поняття не маю, що з іншими відповідями .. lol
— thestar

13
Це повертається до якої редакції? Док каже, що просто замінює найновіший в репо. Питання в тому, як повернутися до більш ранньої версії.
— tgkprog

1
Це повертається до останньої версії repo. Якщо ви прочитаєте опис питань, вам здається, він шукав, як відновити один файл, а не весь каталог.
— thestar

5
Я вважаю, що все це знищує вашу робочу копію, повертаючи її назад до голови. Або до якої колись перевіряли. підтвердити, виконавши оновлення svn -r VER-файл, а потім виконати відновлення svn.
— Джерард ONeill

50

Для одного файлу ви можете зробити:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Можна зробити, svn revert <file>але це відновить лише останню робочу копію.


2
експортувати, а потім вставити його у свою локальну копію, а потім знову зробити це?
— tgkprog

1
@tgkprog - це один із способів цього зробити, так
— Мітч Демпсі

@tgkprog і що таке "кращий" спосіб?
— hbogert

Ніякої ідеї, але це те, що для мене спрацювало: експортував минулий перегляд. Відкрито в блокноті, скопійовано та вставлено у робочий файл. Зобов’язав це очолити з коментарем, який оборот і чому. Інструменти інтерфейсу можуть бути кращим.
— tgkprog

21

Поки всі відповіді тут, мабуть, мають суттєві недоліки, складні (потрібно знайти URI репо), або вони не роблять те, що, ймовірно, задавали питання: як знову повернути Repo в робочий стан з тією старою версією файл .

svn merge -r head:[revision-number-to-revert-to] [file-path]це ІМО - найчистіший і найпростіший спосіб зробити це. Зверніть увагу, що повернення видаленого файлу не працює таким чином [1]. Дивіться також таке питання: Кращий спосіб повернутися до попередньої версії файлу SVN?

[1] Для цього ви хочете svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn upдив. Також Який правильний спосіб відновити видалений файл із SVN?


Хочу зауважити, що принаймні для моєї версії Subversion svn mergeчомусь не сприймається декілька файлів як аргумент. У цьому випадку, здається, нічого не робити (без повідомлення про помилку).
— Wrzlprmft

Але моя команда все ще працює, повторюючи її для кожного файлу, правда?
— Мішель Мюллер

Так, це дійсно так.
— Wrzlprmft

1
Домовились, що це найчистіше.
— KevinG

13

Найкращий спосіб:

svn merge -c -RevisionToUndo ^/trunk

Це скасує всі файли версії, ніж просто відновить ті файли, які ви не любите скасовувати. Не забувайте dash ( -) як префікс для перегляду.

svn revert File1 File2

Тепер виконайте зміни назад.


9

Ви хочете зробити

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

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


7

Я знайшов, що це легко зробити через svn cat команди, щоб вам навіть не потрібно було вказувати версію.

svn cat mydir/myfile > mydir/myfile

Це, ймовірно, не допоможе повернути дані inode (метадані), такі як часові позначки.


потім зафіксувати файл , щоб він йде до репо
— tgkprog

3
Це працювало для мене краще, ніж оновлення. Оскільки оновлення не дозволяє здійснити зміни, внесені до цього файлу. (svn 1.8.3)
— fe_lix_

7

здивований, що ніхто не згадав про це

не дізнавшись ревізійного номера, ви могли це написати, якщо ви просто зробили щось, що хочете відновити, це звичайно спрацює, якщо ви змінили якийсь інший файл, а цільовий файл - не останній змінений файл

svn merge -r HEAD:PREV file

якщо у вас є коментарі, будь ласка, обговоріть тут перед редагуванням?
— Kalpesh Soni

1
Невже сценарій у питанні не вимагає зворотного злиття останньої зміни, щоб ми застосували зміни, необхідні для переходу від HEAD до PREV?
— Нік Руссо

4
Команда повинна бути svn merge -r HEAD:PREV fileтакою, як сказав @Nick Russo
— Хайнц

4

Якщо це лише декілька файлів, і якщо ви використовуєте Tortoise SVN, ви можете використовувати наступний підхід:

  1. Клацніть правою кнопкою миші на вихідному файлі та виберіть "TortoiseSVN" -> "Показати журнал".
  2. Клацніть правою кнопкою миші на ревізію в журналі та виберіть "Зберегти версію до ...".
  3. Нехай стара редакція замінить ваш поточний файл.
  4. Введіть перезаписаний вихідний файл.

Це зберігає новий неперевершений файл, такий як файл-xxxx, де xxxx - старий номер редакції. Що ми робимо далі? видалити нову версію (HEAD напр.), перейменувати новий файл, додати, здійснити?
— Хайнц

Ні, не зберігайте його разом із номером редакції у назві файлу. Збережіть його з точно таким же ім'ям файлу, що і поточна версія того ж файлу (іншими словами, у назві файлу немає xxxx). Тоді просто виконайте звичайне зобов’язання після цього.
— Еллінг

4

Просто додаю до @Mitch Dempsy відповідь, оскільки у мене ще недостатньо респондентів для коментарів.

svn export -r <REV> svn://host/path/to/file/on/repos --force

Додавання --force замінить локальну копію з експортом, і тоді ви можете виконати SVN-зобов’язання, щоб переслати її у сховище.


і це найкраща відповідь :)
— Zgr3doo

чому це найкраща відповідь? він не керує історією "svn way"
— Jason S

2

Альтернативним варіантом для одного файлу є "заміна" поточної версії файлу на старішу версію:

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

Це має додаткову функцію, що небажані зміни не відображаються в журналі для цього файлу (тобто svn file file.ext).


1

Якщо ви хочете скасувати окремий файл із певної версії та зможете скористатися, виконайте такі дії:

svn merge -c - [OldRev #] [Назва файлу]

тобто. svn merge -c -150 myfile.py

Зверніть увагу на мінус на номер редакції


-1
sudo svn revert filename

це кращий спосіб відновити один файл


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