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



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



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



Я создал diff с помощью svn di > ~/os/firstdiff.diff



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



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

782   8  
svn

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 from subversion to a different directory (выберите имя каталога, которого не существует, здесь с помощью подкаталога TMP/).

    $ url=$(svn info . | awk '/^URL/ {print }')
    $ 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 checkout не нужен, вы можете избавиться от него. Ваш рабочий каталог теперь является репозиторием 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

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

Comments

    Ничего не найдено.