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

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

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

Я создал diff с помощью svn di > ~/os/firstdiff.diff
Я еще не использовал никакой другой команды SVN, кроме svn update, до этого.

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

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

Ответ 1

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

svn revert some_file.php

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

Ответ 2

Вам нужно вернуть все изменения, используя команду svn revert:

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

Ответ 3

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

$ svn revert example_directory/example_file.txt

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

$ svn revert -R example_directory/

Ответ 4

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

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

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

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

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

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

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  • Теперь вы можете использовать мощный и удобный 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
    
  • Используя фиксацию, подготовьте патч, который хотите разделить. Для этой цели вы также можете использовать git diff HEAD^..HEAD или git format-patch (последний может использоваться для непосредственной подготовки отправляемых писем, содержащих патч или несколько патчей):

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

svn revert --depth=infinity .

Ответ 7

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

Ответ 8

Используйте Git!

git add -p

дает вам интерактивную возможность выбора изменений для фиксации.