Как отбросить локальные изменения в svn checkout?

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

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

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

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

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

8 ответов


просто использовать svn revert.


вам нужно отменить все изменения, используя SVN revert:

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

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

$ svn revert example_directory/example_file.txt

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

$ svn revert -R example_directory/

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

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

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

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

    $ url=$(svn info . | awk '/^URL/ {print }')
    $ svn checkout "$url" TMP
    
  2. использование этого нетронутого svn checkout как основа, init репозиторий 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.


можно использовать

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

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

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


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

svn revert --depth=infinity .

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


Использовать Git!

git add -p

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