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



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



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



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



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

557   13  

13 ответов:

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

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

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

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

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

svn update -r <earlier_revision_number>

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

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

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

svn update-r yourOldRevesion

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

svn info

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

  1. найти версию, которую вы хотите с помощью svn log.
  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, Я думаю, вам нужно сделать следующее:

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

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

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

из справочных страниц.

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

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


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

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

пример:

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.