Как отменить локальные изменения в проверке SVN?


197

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

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

Я создал diff, используя svn di > ~/os/firstdiff.diff

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

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

Ответы:


253

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

svn revert some_file.php

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


2
За исключением того, что Винаяк может захотеть оставить свои местные неинтересные изменения для себя.
Василий Старынкевич

2
@BasileStarynkevitch: я снова прочитал вопрос, и похоже, что другие изменения не требуются: "" "Остальные изменения, которые я сделал, были в основном для отладки и больше не требуются." "" :)
Седрик Julien

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

193

Вам нужно отменить все изменения с помощью команды svn revert :

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

1
ссылка на svn 1.1 немного устарела, несмотря на то, что это первая ссылка, предоставленная google ;)
Cédric Julien

очевидно, некоторые символы в вашем имени файла могут быть проигнорированы. например icon@2x.png. svn revert icon@2x.png. SVN говорит Пропущенный 'Icon'.
topwik

1
Это лучший ответ. Это должно быть проверено.
rickfoosusa

12
Это svn revert --recursive .мне очень помогает .
Пол Варгас

Это должен быть принятый ответ, поскольку --recursiveпараметр отменяет любые локальные изменения, и это вопрос.
Arueckauer

15

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

$ svn revert example_directory/example_file.txt

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

$ svn revert -R example_directory/

7

Простого 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.


3
Большое спасибо за аноним -1 без каких-либо объяснений. В любом случае, я потратил время, чтобы улучшить ответ, разъяснив, когда этот подход имеет смысл.
FooF

2
Большое спасибо foof за расширение. +1 от меня! Не беспокойся Жесткая толпа.
ErichBSchulz

1
Спасибо за большие пальцы, @ErichBSchulz! Постепенно мы делаем мир лучше для жизни, несмотря на противников !!! ;-)
FooF

4

Вы могли бы использовать

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

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

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


+1 Это лучшее решение проблемы, но в этом случае я действительно хотел избавиться от всех своих изменений. Конечно, я не хотел бы, чтобы revertмои изменения все время. Так что я бы использовал ваш путь в будущем.
Винаяк Гарг

3

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

svn revert --depth=infinity .

1
svn revert -R .может быть короче
jesjimher

1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.