Как отменить локальные изменения в проверке SVN? - PullRequest
177 голосов
/ 27 февраля 2012

Я хотел бы отправить diff на рассмотрение для проекта с открытым исходным кодом.

Я получил код, используя SVN (из терминала, Ubuntu). И я сделал незначительные правки в нескольких файлах. Теперь есть только одно изменение, которое я хочу отправить. Остальные изменения, которые я сделал, были для отладки и больше не требуются.

Я сгенерировал diff, используя svn di > ~/os/firstdiff.diff

Итак, мой вопрос, как отменить мои локальные изменения?

Есть ли способ SVN сделать это? Если нет, мне придется перейти к каждому файлу и удалить все свои правки. Затем я сгенерирую новый diff и отправлю его.

Ответы [ 7 ]

226 голосов
/ 27 февраля 2012

Просто используйте команду svn revert, например:

svn revert some_file.php

Это (как и любая другая команда svn) хорошо документировано в ресурсе svnbook или на странице руководства, или даже с помощью команды svn help.

174 голосов
/ 27 февраля 2012

Необходимо отменить все изменения с помощью команды svn revert :

  • Восстановить изменения в файле: svn revert foo.c
  • Восстановить весь каталогфайлов: svn revert --recursive .
15 голосов
/ 16 мая 2014

Чтобы отменить локальные изменения в одном конкретном файле:

$ svn revert example_directory/example_file.txt

Чтобы отменить локальные изменения в одной конкретной папке:

$ svn revert -R example_directory/
7 голосов
/ 18 ноября 2014

Простых svn revert было достаточно для оригинального постера. Однако простой svn revert не подойдет в более общем случае, когда вы

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

@ Предложение ErichBSchulz об использовании git add -p очень разумно и гораздо более применимо в таком случае. В ответе просто не хватало некоторых деталей. Предполагая, что ваш текущий каталог - это каталог, который вы хотите сделать совместимым патчем, вы можете сделать что-то вроде этого:

  1. Извлечь нетронутую версию из subversion в другой каталог (выберите имя каталога, которого не существует, здесь, используя подкаталог TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. Используя эту нетронутую проверку SVN в качестве основы, запустите git-репозиторий, игнорируя каталоги .svn; передайте все в svn head в ваш временный git-репозиторий

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. Скопируйте вновь подготовленные метаданные git-репозитория в исходный рабочий каталог; поскольку каталог для извлечения нетронутой Subversion не нужен, вы можете от него избавиться. Ваш рабочий каталог теперь является и Git, и Subversion репозиторием:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. Теперь вы можете использовать мощный и удобный git add -p, чтобы интерактивно выбирать, что именно вы хотите поделиться, и фиксировать их в своем git-репозитории. Если вам нужно добавить файлы в коммит, также сделайте git add <file-to-add> до git commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. Используя коммит, подготовьте патч, которым вы хотите поделиться. Для этой цели вы также можете использовать git diff HEAD^..HEAD или git format-patch (последний может использоваться для непосредственной подготовки писем для отправки, содержащих исправление или несколько исправлений):

    $ git show -p HEAD > my-mighty-patch.patch
    

Чтобы избавиться от метаданных git, просто сделайте rm -rf .git/. Если вы планируете продолжить взлом с использованием исходного рабочего каталога, вы можете продолжить использовать git для управления локальными изменениями. В этом случае вы, вероятно, выиграете от обучения изучению использования git svn.

Примечание: Если вы знакомы с git, это довольно тривиальная вещь для импровизации. В противном случае это выглядит, возможно, немного грязно. Вы можете обобщить подход, написав скрипт из этих шагов для реализации «интерактивного коммита» или «интерактивного создания патча» для svn, который можно использовать без какого-либо понимания git.

4 голосов
/ 27 февраля 2012

Вы можете использовать

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

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

Как и другие отвечали, вы также можете использоватьsvn revert осторожно.Это зависит от того, хотите ли вы сохранить свои локальные изменения для будущей работы или нет ...

3 голосов
/ 22 апреля 2017

Перейдите в корень этого хранилища и выполните следующую команду

svn revert --depth=infinity .
1 голос
/ 27 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...