Как мне вернуться к более старой версии нашего кода в Subversion? - PullRequest
464 голосов
/ 02 мая 2009

Я работаю над проектом с другом и хочу вернуться к более старой версии нашего кода и установить его в качестве текущей. Как мне это сделать?

Я использую "anksvn" на vs08.

У меня есть версия, которую я хочу на моем ПК, но фиксация не удалась; Я получаю сообщение "ошибка фиксации, файл или каталог устарели."

У меня также есть клиент Subversion на моем компьютере.

Ответы [ 14 ]

746 голосов
/ 02 мая 2009

По сути, вам нужно «объединить в обратном направлении» - применить diff между текущей и предыдущей версией до текущей версии (чтобы вы получили рабочую копию, похожую на старую версию), а затем зафиксировать снова , Например, перейти от ревизии 150 (текущей) к ревизии 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

В Красной книге Subversion есть хороший раздел об этом .

168 голосов
/ 02 мая 2009

Вы можете вносить новые изменения только в заголовок истории подрывной деятельности.

Причина, по которой вы ничего не можете сделать напрямую с хорошей копией, имеющейся на вашем ПК, заключается в том, что ее папки .svn знают, что это код из прошлого, поэтому перед обновлением требуется обновление.

Найдите правильный номер ревизии и вернитесь

  1. Найдите номер ревизии старой копии, которую вы хотите. Получите текущую версию с:

    svn info --show-item revision
    # or
    svn log
    

    Или используйте:

    svn update -r <earlier_revision_number>
    

    для проверки различных более старых версий вашего проекта, пока вы не найдете правильный номер редакции.

  2. Запишите правильный номер редакции (предположим, 123 для примеров ниже).

  3. Обновление до последней редакции:

    svn update
    
  4. Отменить все изменения между нужной ревизией и последней версией:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"
    

    (аналогично ответу Джона Скита выше.)

Если вы не можете найти номер ревизии

Если вы не можете найти старую копию и хотите просто зафиксировать файлы, которые в данный момент хранятся на вашем ПК:

  1. Сделайте копию своей хорошей версии (но без каких-либо папок .svn):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
    
  2. Теперь убедитесь, что у вас последняя версия:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
    
  3. Скопируйте хорошую версию поверх рабочей копии.

    Эта команда скопирует, а также удалит из рабочего дерева любые файлы, которых нет в вашей хорошей копии, но это не повлияет на существующие папки .svn.

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/
    

    Если у вас нет rsync, вы можете использовать cp -a, но вам также необходимо удалить ненужные файлы вручную.

  4. Вы должны быть в состоянии совершить то, что у вас есть сейчас.

    cd project
    svn commit "Reverted to good copy"
    
35 голосов
/ 27 марта 2013

Просто используйте эту строку

svn update -r yourOldRevesion

Вы можете узнать свою текущую ревизию, используя:

svn info

27 голосов
/ 03 июля 2009

Стандартный способ использования слияния для отмены всей регистрации отлично работает, если вы этого хотите. Иногда, однако, все, что вы хотите сделать, это вернуть один файл. Нет законного способа сделать это, но есть взлом:

  1. Найдите версию, которую вы хотите, используя svn log.
  2. Использовать подкоманду svn export:

    svn export http://url-to-your-file @ 123 / tmp / filename

(где 123 - номер редакции для хорошей версии файла.) Затем либо переместите, либо скопируйте этот единственный файл, чтобы перезаписать старый. Проверьте измененный файл, и все готово.

8 голосов
/ 02 сентября 2013

Немного больше старой школы

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

тогда обычный

svn diff
svn commit
5 голосов
/ 13 апреля 2013

Я думаю, что это наиболее подходит:

Выполните слияние в обратном направлении, например, если зафиксированный код содержит ревизию из с 5612 по 5616, просто слить назад. Это работает в моем конце.

Например:

svn merge -r 5616:5612 https://<your_svn_repository>/

Он будет содержать объединенный код обратно в прежнюю ревизию, тогда вы сможете его зафиксировать.

3 голосов
/ 01 марта 2014

Это то, что я сделал и работал для меня.

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

  1. Перейти в команду -> Показать историю.
  2. Щелкните правой кнопкой мыши или диапазон ревизий, которые вы хотите игнорировать.
  3. Выберите опцию «Отменить изменения».

Это запустит обратное слияние, отменяя изменения в вашей рабочей копии.

Просто просмотрите код и подтвердите.

2 голосов
/ 02 мая 2009

Щелкните правой кнопкой мыши по самой высокой иерархии, которую вы хотите восстановить >> Revert или Revert to Revision

1 голос
/ 24 мая 2017

В большинстве предыдущих ответов использовалось обратное слияние, и обычно это правильный ответ. Однако есть одна ситуация (которая только что произошла со мной), когда это не так.

Я случайно изменил файл с окончанием строки Unix на конец строки DOS при внесении небольшого изменения и зафиксировал его. Это легко отменить, либо изменив окончание строки и снова зафиксировав, либо с помощью обратного слияния, но это приведет к тому, что svn blame внесет мое редактирование в качестве источника каждой строки файла. (Интересно, что на TortoiseSVN в Windows это не влияет; только командная строка svn blame.)

Если вы хотите сохранить историю в соответствии с сообщением svn blame, я думаю, вам нужно сделать следующее:

  • Удалить файл и зафиксировать.
  • В репозитории скопируйте предыдущую хорошую копию файла в заголовок и подтвердите.
  • Восстановите все правки, которые вы хотите сохранить.

Удаление немного страшно, но помните, что у вас всегда есть файл, сохраненный в репозитории, поэтому его восстановление не имеет большого значения. Вот некоторый код для иллюстрации шагов. Предположим, что xxx - это номер редакции последней удачной копии.

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

Обратите внимание, что для копии в хранилище местом назначения должен быть каталог, а не имя файла.

1 голос
/ 06 сентября 2016

Щелкните правой кнопкой мыши проект> Заменить на> Ревизия или URL> Выберите конкретную ревизию, которую вы хотите отменить.

Теперь передайте локальную версию кода обновления в хранилище. Это вернет базу кода к определенной ревизии.

...