Как вернуться к более старой версии нашего кода в Subversion?

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

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

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

У меня также есть клиент subversion на моем ПК.

13 ответов


в основном вам нужно "объединить назад" - применить разницу между текущей и предыдущей версиями to текущая версия (таким образом, вы получаете рабочую копию, похожую на старую версию), а затем снова фиксируете. Так, например, перейти от версии 150 (текущей) обратно к версии 140:

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

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


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

можно использовать

svn update -r <earlier_revision_number>

чтобы проверить различные старые версии вашего проекта, пока вы не найдете правильный номер версии, вашего версию. Когда вы его нашли, обновите до самого нового (head) пересмотр, затем примените слияние svn, как предложено выше.

Если вы действительно не можете найти его, и нужно чтобы зафиксировать копию на вашем ПК, а затем получить новое обновление до последней версии и скопировать "хорошую" версию поверх нее (без the .папки svn!). Удалите все файлы, которые не были в хорошей копии из папок и из subversion, и зафиксируйте то, что у вас есть сейчас.


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

svn update-r yourOldRevesion

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

svn info


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

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

    SVN экспортировать http://url-to-your-file@123 / tmp / filename

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


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

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

затем обычно

svn diff
svn commit

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

выполните слияние назад, например, если зафиксированный код содержит ревизию из rev 5612 до 5616, просто объедините его назад. С моей стороны это работает.

например:

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

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


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

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

  1. перейти к команде - > показать историю.
  2. щелкните правой кнопкой мыши на или диапазоне ревизий, которые вы хотите игнорировать.
  3. выберите опцию "отменить изменения".

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

просто комментарий код и совершать.


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


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

теперь зафиксируйте версию кода локального обновления в репозитории. Это приведет к возврату базы кода к конкретному пересмотру.


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

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

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

  • удалить файл и фиксации.
  • в репозитории скопируйте предыдущую хорошую копию файла в head и зафиксируйте.
  • восстановить любые изменения, которые вы хотите сохранить.

в удаление немного страшно, но помните, что у вас всегда есть файл, сохраненный в репозитории, поэтому восстановление его не имеет большого значения. Вот код, иллюстрирующий эти шаги. Предположим, что 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"

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


синхронизировать со старой версией и зафиксировать ее. Это должно сработать.

здесь также объяснение отмены изменений.


ответ Джона Скита-это в значительной степени решение в двух словах, однако, если вы похожи на меня, вам может понадобиться объяснение. Руководство Subversion называет это

Вишневый Выбор Слияние

из man-страниц.

  1. эта форма называется слиянием " cherry-pick: '- r N:M ' относится к различию в истории ветвь источника между ревизиями N и M.

    для отмены изменений можно использовать "обратный диапазон". Например, когда источник и цель относятся к той же ветви, ранее зафиксированной ревизию можно "отменить". В обратный спектр, N больше, чем M в '- r N:M', или опция '- c 'используется с отрицательным числом: '- c-M' эквивалентно ' - r M:'. Отмена изменений как это также известно как выполнение "обратного слияния".


  • если источником является файл, то применяются различия к этому файл (полезно для обратного слияния предыдущих изменений). Иначе, если источником является каталог, то целевой объект по умолчанию имеет значение '.'.

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

пример:

svn merge -r 2983:289 path/to/file

это заменит локальную копию[2983] (которая, согласно приведенной выше цитате, должна быть синхронизирована с сервером--your ответственность) с редакцией 289 с сервера. Изменение происходит локально, что означает, что если у вас есть чистая проверка, то изменения могут быть проверены перед их фиксацией.


следующее сработало для меня.

У меня было много локальных изменений, и мне нужно было отбросить их в локальной копии и проверить последнюю стабильную версию в SVN.

  1. проверить состояние всех файлов, включая игнорируемые файлы.

  2. Grep все строки, чтобы получить вновь добавленные и проигнорированные файлы.

  3. заменить на //.

  4. и РМ -РФ все русло.

    статус svn --no-ignore / grep '^[?I] '| sed " s / ^[?I] / / "/ xargs-I{} rm-rf" {}"