Повернення одного файлу в 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.