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

StackOverflow https://stackoverflow.com/questions/814433

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

  

svn update -r yourOldRevesion

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

  

svn info

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

<Ол>
  • Найдите нужную версию с помощью svn log.
  • Используйте подкоманду svn export:

    svn export http: // url-to-your-file @ 123 / tmp / Имя файла

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

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

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

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

    svn diff
    svn commit
    

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

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

    Например:

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

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

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

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

    <Ол>
  • Перейти в команду - > Показать историю.
  • Щелкните правой кнопкой мыши или диапазон ревизий, которые вы хотите игнорировать.
  • Выберите " отменить изменения " вариант.
  • Это запустит обратное слияние, отменяя изменения в вашей рабочей копии.

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

    Нажмите правой кнопкой мыши на наивысшей иерархии, которую вы хотите восстановить > > Вернуть или Вернуть к редакции

    Щелкните правой кнопкой мыши проект > Заменить на > Редакция или 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 называет это

    Слияние с Вишневым сортом

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

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

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

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

    svn merge -r HEAD:12345 .
    

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

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

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

    <Ол>
  • Проверьте состояние всех файлов, включая игнорируемые файлы.

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

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

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

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

  • scroll top