Лучший способ вернуться к предыдущей версии SVN файла?

Я случайно передал слишком много файлов в репозиторий SVN и изменил некоторые вещи, на которые я не хотел. (Вздох.) Чтобы вернуть их в прежнее состояние, лучшее, что я мог придумать, было

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

Jeez! Нет ли лучшего способа? Почему я не могу просто написать что-то вроде этого:

svn revert -r 854 l3toks.dtx

Хорошо, я использую только v1.4.4, но я просмотрел список изменений для ветки 1.5, и я не мог видеть ничего, непосредственно связанного с этим. Я что-то пропустил?


Изменить: Я думаю, я был недостаточно ясен. Я не думаю, что хочу свернуть слияние, потому что тогда я потеряю те изменения, которые я хочу сделать! Скажем, что fileA и fileB были изменены, но я хотел только зафиксировать fileA; случайно набрав

svn commit -m "small change"

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

Ответ 1

svn merge -r 854:853 l3toks.dtx

или

svn merge -c -854 l3toks.dtx

Две команды эквивалентны.

Ответ 3

Извините, что вы использовали некоторое пространство только для повторения ранее заданного ответа - но это то, с чем я всегда сталкиваюсь.

Скажем, я обновил локальные файлы до последней версии, то есть 854. Тогда мне бы хотелось получить более старую версию - версию файла из нескольких версий раньше, скажем, версию 851.

Копия будет работать:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. однако, я не могу беспокоить grepping для URL-адреса репо:)

Обновление, похоже, может работать:

svn up -r 851 ./l3toks.dtx

... однако он также отмечает локальную копию как "недавно выписанную", точнее "такую ​​же, как онлайн-версия" (т.е. в Tortoise/RabbitVCS вы получаете зеленую галочку OK), что означает, что вы не можете сделать svn ci -m "rolled back to r 851": просто потому, что локальный исполняемый файл subversion не заметит каких-либо локальных изменений и не будет загружен в онлайн-репозиторий.

И, как уже было сказано, обратное слияние работает, но в этом случае нельзя полагаться на синтаксис ярлыков; но конкретно укажите:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

Я должен признать, что я никогда не пойму предложение "Обратное слияние r854 через r852 в файл", чтобы означать "Только что получил r851 вашего файла и перезаписал все, что вы ранее локально, - и оно помечено как отличное от последнего онлайн, так что вы можете проверить его в онлайн как новую ревизию" откат", но я думаю (и надеюсь:)), что и есть.

После этого можно использовать svn diff для быстрой проверки, если мы получим правильную ревизию на месте; а также файл будет отмечен красным восклицательным знаком в Tortoise/RabbitVCS (то есть отличается от последней совершенной версии), и поэтому svn ci -m "rolled back to r 851" может работать на этот раз.

Также обратите внимание, что если вы, наконец, передумаете после обратного слияния (т.е. вы все равно хотите продолжить работу над последней версией HEAD, здесь 854 - после того, как вы вернулись на 851 локально, но еще не совершил откат), вы не должны использовать svn up, потому что он просто скажет, что он уже "при пересмотре 854"; вместо этого используйте svn revert --recursive . или подобное...

Ура!

Ссылка: Как отменить изменения с помощью Subversion - Jacob Wright - Flex, AIR, PHP и т.д.

EDIT:... и, по-видимому, точно такой же эффект, как svn merge -r HEAD:851 l3toks.dtx, может быть достигнут с помощью:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.

Ответ 4

Недавно мне пришлось вернуться к определенной ревизии для отладки старой сборки, и это сработало как магия:

svn up -r 3340 (or what ever your desired revision number)

Мне пришлось разрешать все конфликты с помощью опции "tc", поскольку меня не интересовали локальные изменения (проверено во всем, о чем я заботился до возврата)

Чтобы вернуться к пересмотру главы, было просто:

svn up

Ответ 5

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

Ответ 6

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

Ответ 7

Если вы хотите только отменить последний checkin, вы можете использовать следующие

svn merge -r head:prev l3toks.dtx

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

Ответ 8

svn merge объединит ревизии, а не вернет их. т.е. если у вас есть добавление в вашей версии HEAD, то слияние с предыдущей версией, то изменение будет сохраняться.

Я использую svn cat, а затем перенаправляю его в файл:

svn cat -r 851 l3toks.dtx > l3toks.dtx

Затем у вас есть 851 контент в этом файле и можно проверить его обратно.

Ответ 9

Если вы используете Eclipse IDE с плагином SVN, вы можете сделать следующее:

  • Щелкните правой кнопкой мыши файлы, которые вы хотите вернуть (или папку, в которой они содержались, если вы удалили их по ошибке и хотите добавить их обратно).
  • Выберите " Командa > Переключить"
  • Выберите кнопку "Редакция" и введите номер версии, к которой вы хотите вернуться. Нажмите OK
  • Перейдите к перспективе синхронизации.
  • Выберите все файлы, которые вы хотите вернуть
  • Щелкните правой кнопкой мыши выбор и сделайте " Переопределить и зафиксировать..."

Это вернет файлы к требуемой ревизии. Просто имейте в виду, что SVN увидит изменения как новые фиксации. То есть, изменение получает новый номер версии, и нет никакой связи между старой версией и новой. Вы должны указать в комментариях фиксации, что вы возвращаете эти файлы к определенной ревизии.