Возврат отдельного файла в SVN к определенной ревизии
У меня есть файл, как показано ниже в репозитории 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
13 ответов
Если вам просто нужен старый файл в вашей рабочей копии:
svn up -r 147 myfile.py
Если вы хотите выполнить откат, посмотрите это " Как вернуться к более старой версии нашего кода в Subversion?".
svn cat тоже принимает ревизионный аргумент!
svn cat -r 175 mydir/myfile > mydir/myfile
Для одного файла вы можете сделать:
svn export -r <REV> svn://host/path/to/file/on/repos file.ext
Вы могли бы сделать svn revert <file>
но это только восстановит последнюю рабочую копию.
Пока что все ответы здесь имеют существенные недостатки, сложны (необходимо найти 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?
Лучший способ это:
svn merge -c -RevisionToUndo ^/trunk
Это отменит все файлы ревизии, чем просто вернет те файлы, которые вы не хотите отменить. Не забудь тире (-
) в качестве префикса для ревизии.
svn revert File1 File2
Теперь внесите изменения обратно.
Ты хочешь сделать
svn merge -r [revision to revert from]:[revision to revert to] [path/filename]
Как только вы это сделаете, у вас будет эта ревизия файла в состоянии фиксации. Зафиксируйте файл.
Удивлен, никто не упомянул об этом
без определения номера ревизии вы могли бы написать это, если вы просто зафиксировали что-то, что хотите вернуть, это не сработает, если вы изменили какой-то другой файл и целевой файл не является последним измененным файлом
svn merge -r PREV:HEAD file
Я обнаружил, что это легко сделать через svn cat
команда, так что вам даже не нужно указывать ревизию.
svn cat mydir/myfile > mydir/myfile
Это, вероятно, не будет выполнять роль данных inode (метаданных), таких как метки времени.
Если это всего лишь пара файлов, и если вы используете Tortoise SVN, вы можете использовать следующий подход:
- Щелкните правой кнопкой мыши по исходному файлу и выберите "TortoiseSVN" -> "Показать журнал".
- Щелкните правой кнопкой мыши ревизию в журнале и выберите "Сохранить ревизию в...".
- Позвольте старой ревизии перезаписать ваш текущий файл.
- Зафиксируйте перезаписанный исходный файл.
Просто добавляю ответ @Mitch Dempsy, так как у меня пока недостаточно комментариев, чтобы комментировать.
svn export -r <REV> svn://host/path/to/file/on/repos --force
При добавлении --force локальная копия будет перезаписана при экспорте, а затем вы можете выполнить фиксацию SVN, чтобы отправить ее в хранилище.
Альтернативный вариант для одного файла - "заменить" текущую версию файла более старой версией:
svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci
Это имеет добавленную функцию, что нежелательные изменения не отображаются в журнале для этого файла (то есть svn log file.ext).
Если вы хотите откатить отдельный файл из определенной ревизии и выполнить коммит, то выполните:
svn merge -c - [OldRev #] [Имя файла]
то есть. svn merge -c -150 myfile.py
Обратите внимание на отрицательный номер ревизии