Svn вернуть предыдущую версию файла

Обновлено: 07.07.2024

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

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

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

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

Спасибо за это, просто хотел что-то заявить - скажем, я на ревизии 855, я хочу вернуть файл к ревизии 854. Если я делаю svn merge -c -854 my.file , а затем делаю svn diff , то, кажется, показывает одну ревизию до 854 (то есть 853 ); только когда я делаю svm merge -c 854 myfile (без - ), похоже, что myfile возвращается к rev 854. Еще раз спасибо, ура! Есть ли причина, по которой первый вариант, описанный выше, сработал для меня, а второй не работал вообще? Не забудьте зафиксировать после обратного слияния. Я часто забываю :) Действительно, должно быть минус 1, чтобы не указывать разницу между этими двумя командами. Плохой ответ

Ознакомьтесь с разделом " Отмена изменений " в svn book

Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели представление о том, что это такое и почему оно есть. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно недоступен.

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

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

Скопировать будет работать:

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

Обновление вроде бы может сработать:

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

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

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

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

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

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

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

Выберите TortoiseSVN → Журнал для отображения списка ревизий. Возможно, вам понадобиться использовать кнопки Показать все или Следующие 100 для отображения нужных вам ревизий.

Выберите ревизию, которую вы хотите вернуть. Если вы хотите отменить диапазон ревизий, то выберите первую и, удерживая клавишу Shift , выберите последнюю. Если вы хотите выбрать отдельные ревизии и диапазоны, то используйте клавишу Ctrl при выборе ревизий. Выполните правый щелчок на выбранных ревизиях, после чего выберите Контекстное меню → Отменить изменения из этой ревизии .

Или, если вы желаете сделать более раннюю ревизию новой ведущей, выполните правый щелчок на выбранной ревизии, затем выберите Контекстное меню → Вернуть к этой ревизии . Это действие отменит все изменения после выбранной ревизии.

Вы выполнили отмену изменений внутри вашей рабочей копии. Проверьте результат, затем зафиксируйте изменения.

Используя диалог слияния

Если вы хотите ввести номера ревизий списком, то используйте диалог Слияние. В предыдущем методе слияние используется негласно, в этом методе оно применяется явно.

В вашей рабочей копии выберите TortoiseSVN → Слить. [5] .

В диалоге Тип слияния выберите Слияние диапазона ревизий .

В поле От: введите полный URL-адрес хранилища вашей папки рабочей копии. Это будет URL по умолчанию.

В поле Диапазон ревизий для слияния введите список ревизий для отката (или используйте диалог журнала для их выбора, как описано выше).

Убедитесь, что установлен флажок Обратное слияние .

В диалоге Параметры слияния согласитесь со значениями по умолчанию.

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

Используя svndumpfilter

Поскольку данные в TortoiseSVN никогда не пропадают, ваши « отменённые » ревизии всё ещё существуют как промежуточные ревизии в хранилище. Только ведущая ревизия была изменена к предыдущему состоянию. Если вы желаете полностью убрать ревизии из хранилища и удалить все когда-либо существовавшие следы, вы должны будете применить более экстремальные меры. Это делать не рекомендуется , если только у вас нет очень веских оснований. Одной из возможных причин может быть фиксация конфиденциального документа в общедоступном хранилище.

Единственный способ удалить данные из хранилища - это использование инструмента командной строки Subversion svnadmin . Описание того, как с ним работать, содержит раздел Обслуживание хранилища (Repository Maintenance) книги о Subversion.

[5] теперь слияние произодится при помощи мастера, в котором для этой задачи есть специальный пункт Произвести слияние диапазона ревизий . На следующей странице мастера укажите нужный диапазон ревизий (можно использовать журнал) и отметьте флажок Обратное слияние . Подробнее об этом рассказывает «Слияние с диапазоном ревизий» - прим. переводчика

У меня есть файл, как показано ниже в SVN-репо, который я хотел бы вернуть к предыдущей версии. Каков способ сделать это в SVN? Я хочу только понизить этот конкретный файл до более старой версии, а не всего репо.

Если вам нужен только старый файл в вашей рабочей копии:

svn cat также принимает аргумент ревизии!

svn cat -r 175 mydir/myfile > mydir/myfile

это должно вернуть один файл.

Для одного файла вы можете сделать:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Вы можете сделать svn revert <file> , но это восстановит только последнюю рабочую копию.

До сих пор все ответы здесь, по-видимому, имеют существенные недостатки, сложны (нужно найти URI репо), или они не делают то, что, возможно, задал вопрос: как вернуть Repo в рабочее состояние с помощью этого более старого версии файла.

svn merge -r head:[revision-number-to-revert-to] [file-path] - это ИМО самый чистый и самый простой способ сделать это. Обратите внимание, что возврат удаленного файла не работает таким образом [1]. См. Также следующий вопрос: Лучший способ вернуться к предыдущей версии SVN файла?

[1] Для этого вы хотите svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up , см. также Каков правильный способ восстановления удаленного файла из SVN?

Это приведет к отмене всех файлов ревизии, чем просто отменить тот файл, который вы не хотите отменять. Не забывайте тире ( - ) в качестве префикса для ревизии.

Теперь верните изменения.

Мне было легко сделать это с помощью команды svn cat , так что вам даже не нужно указывать ревизию.

Это, вероятно, не будет возвращать данные inode (метаданные), такие как временные метки.

Ты хочешь сделать

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

Как только вы это сделаете, у вас будет эта ревизия файла в состоянии фиксации. Зафиксируйте файл.

Если это всего лишь несколько файлов, и если вы используете Tortoise SVN, вы можете использовать следующий подход:

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

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

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

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


9 ответы

Спасибо за это, просто хотел кое-что сказать - скажем, у меня ревизия 855, я хочу вернуть файл к ревизии 854. Если я это сделаю svn merge -c -854 my.file , а затем сделайте svn diff , кажется, отображается одна ревизия перед 854 (то есть 853); только когда я это сделаю svm merge -c 854 myfile (без - ), похоже, что myfile вернулся к версии 854. Еще раз спасибо, ура! - sdaau

Есть ли причина, по которой первый вариант выше работал для меня как шарм, а второй не работал ВООБЩЕ? - Skybondsor

Однако не забудьте сделать коммит после обратного слияния. Я часто забываю :) - Винит Прадхан

На самом деле следует минус 1, чтобы не указать, в чем разница между этими двумя командами. Плохой ответ - Злой Дэн

@sprog - если есть разница, я был бы признателен - orip

ответ дан 06 дек '08, 10:12

Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши друзья-пользователи имели некоторое представление о том, что это такое и почему. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно отключен. - user2084795

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

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

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

.. однако меня не беспокоит поиск URL-адреса репо :)

Обновление вроде бы может сработать:

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

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

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

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

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

Читайте также: