Возврат отдельного файла в 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 лет назад, лол
Kalpesh Soni

Ответы:

181

Если вы просто хотите старый файл в вашей рабочей копии:

svn up -r 147 myfile.py

Если вы хотите выполнить откат, посмотрите это « Как вернуться к более старой версии нашего кода в Subversion? ».

Эрик Хаузер
источник
8
но при следующем обновлении он получит файл, который вы не хотели возвращать ...: S
andygoestohollywood
2
если вы не хотите его возвращать, SVN зафиксирует этот файл, чтобы поместить нужную версию в репозиторий
Packet Tracer
14
Это, вероятно, на самом деле не делает то, что хотел спрашивающий вопрос. Благодаря этому рабочая копия является чистой и не может быть зафиксирована как есть, а «svn update» без указания номера версии извлечет последнюю нежелательную версию.
CXJ
1
Как я могу зафиксировать возвращенный файл тогда?
Марсио
2
Это не совсем правильно, потому что, как упоминает CXJ, нет способа зафиксировать обновленный файл. Возможно, вы захотите сделать так, как говорит Митч Демпси (однако обратите внимание, что --force принудительно перезаписывает файл): svn export --force -r 147 myfile.py myfile.py
avejidah
76

svn cat тоже принимает ревизионный аргумент!

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

Никогда не спи снова
источник
20
Это, безусловно, лучший ответ на странице. Он оставляет измененный файл в состоянии, которое может быть зафиксировано.
dotancohen
это не работает, когда вы вставляете в новый файл
ahnbizcad
Хаха, оглядываясь назад, IDK, в каком контексте я думал, когда я отправил. Я не могу вспомнить. Это кажется бессмысленным.
ahnbizcad
Это просто и понятно, когда вы просто хотите отменить изменения и вернуть файл в состояние предварительной фиксации без каких-либо технических средств контроля версий.
Аноним
57
svn revert filename 

это должно вернуть один файл.

звезда
источник
4
Что случилось со всеми другими ответами с более длинными командами? Спасибо.
masterxilo
Добро пожаловать. Я понятия не имею, что
случилось
13
Это возвращается к какой ревизии? Док говорит, что просто заменяет последнее в репо. Вопрос в том, как вернуться к более ранней версии.
tgkprog
1
Это возвращается к последней версии репо. Если вы читаете описание вопросов, похоже, он искал способ вернуть один файл, а не весь каталог.
thestar
5
Я полагаю, что все, что это делает, это уничтожает вашу рабочую копию, «возвращая» ее обратно в голову. Или к которому когда-либо был проверен. подтвердите, выполнив svn update -r VER file, затем выполните svn revert.
Джерард ONeill
50

Для одного файла вы можете сделать:

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

Вы можете сделать, svn revert <file>но это восстановит только последнюю рабочую копию.

Митч Демпси
источник
2
экспортировать, затем вставить его в локальную копию, а затем зафиксировать снова?
tgkprog
1
@tgkprog, это один из способов сделать это, да
Митч Демпси
@tgkprog а какой "предпочтительный" способ?
hbogert
Понятия не имею, но это то, что сработало для меня: экспортированная прошлая ревизия. Открывается в блокноте, копируется, вставляется в рабочий файл. Посвящены этому, чтобы прокомментировать, какой rev и почему. Инструменты пользовательского интерфейса могут иметь лучший способ.
tgkprog
21

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

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

Теперь передайте изменения обратно.

khmarbaise
источник
9

Вы хотите сделать

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

Как только вы это сделаете, у вас будет эта ревизия файла в состоянии фиксации. Зафиксируйте файл.

Дженнифер Элиз
источник
7

Я обнаружил, что это легко сделать с помощью svn catкоманды, так что вам даже не нужно указывать ревизию.

svn cat mydir/myfile > mydir/myfile

Это, вероятно, не будет выполнять роль данных inode (метаданных), таких как метки времени.

Джозеф Коко
источник
затем зафиксируйте файл, чтобы он отправился в
репозиторий
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
Heinz
4

Если это всего лишь пара файлов, и если вы используете Tortoise SVN, вы можете использовать следующий подход:

  1. Щелкните правой кнопкой мыши по исходному файлу и выберите «TortoiseSVN» -> «Показать журнал».
  2. Щелкните правой кнопкой мыши ревизию в журнале и выберите «Сохранить ревизию в ...».
  3. Позвольте старой ревизии перезаписать ваш текущий файл.
  4. Зафиксируйте перезаписанный исходный файл.
Эллинг
источник
Это сохраняет новый неверсионный файл, такой как file-xxxx, где xxxx - старый номер ревизии. Что мы будем делать дальше? удалить новую ревизию (например, HEAD), переименовать новый файл, добавить, зафиксировать?
Хайнц
Нет, не сохраняйте его с номером ревизии в имени файла. Сохраните его с точно таким же именем файла, что и текущая версия того же файла (другими словами, без имени xxxx в имени файла). Затем просто сделайте обычный коммит после этого.
Elling
4

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

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

При добавлении --force локальная копия будет перезаписана при экспорте, а затем вы можете выполнить фиксацию SVN, чтобы отправить ее в хранилище.

Кристина
источник
и это лучший ответ :)
Zgr3doo
почему это лучший ответ? он не управляет историей "svn way"
Джейсон С
2

Альтернативный вариант для одного файла - «заменить» текущую версию файла более старой версией:

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

Это имеет дополнительную особенность, что нежелательные изменения не отображаются в журнале для этого файла (то есть svn log file.ext).

Роберт Леланд
источник
1

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

svn merge -c - [OldRev #] [Имя файла]

то есть. svn merge -c -150 myfile.py

Обратите внимание на отрицательный номер ревизии

Olmstov
источник
-1
sudo svn revert filename

это лучший способ вернуть один файл

Малликарьюн С.К.
источник
2
Я действительно надеюсь, что вы никогда не приблизитесь к производственной машине с разрешениями sudoer.
Дэвид Лакатос