Подтвердить что ты не робот

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

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

Я использую "anksvn" для vs08.

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

svn update -r yourOldRevesion

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

свн информация

Ответ 4

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

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

    svn export http://[email protected]123/tmp/filename

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

Ответ 5

Немного более старая школа

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

то обычный

svn diff
svn commit

Ответ 6

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

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

Например:

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

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

Ответ 7

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

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

  • Перейдите в раздел Команда → Показать историю.
  • Щелкните правой кнопкой мыши диапазон или диапазон изменений, которые вы хотите игнорировать.
  • Выберите опцию "Отменить изменения".

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

Просто просмотрите код и зафиксируйте.

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

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

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

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

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/[email protected] svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

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

Ответ 12

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

Cherry-Pick Merge

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

  1. Эта форма называется слиянием "вишня": "-r N: M" относится к разнице в истории ветки источника между ревизиями N и M.

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


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

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

Пример:

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

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

Ответ 13

На этой странице много опасных ответов. Обратите внимание, что начиная с версии 1.6 SVN, обновление -r может вызывать конфликты деревьев, которые быстро перерастают в потенциально кошмарный, теряющий данные кошмар, где вы ищете информацию о конфликтах деревьев.

Правильный способ вернуться к версии:

svn merge -r HEAD:12345 .

Где 12345 - номер версии. Не забывайте точку.

Ответ 14

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

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

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

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

  3. Замените их на //.

  4. и rm -rf все строки.

    svn status --no -I gnore | grep '^ [? I]' | sed "s/^ [? I]//" | xargs -I {} rm -rf "{}"