Простых svn revert
было достаточно для оригинального постера. Однако простой svn revert
не подойдет в более общем случае, когда вы
- имеет как правки, которыми вы хотите поделиться, так и правки, которые вы не хотите передавать в того же файла ,
- имеет локальные изменения, которые вы все еще хотите сохранить для своей личной выгоды .
@ Предложение ErichBSchulz об использовании git add -p
очень разумно и гораздо более применимо в таком случае. В ответе просто не хватало некоторых деталей. Предполагая, что ваш текущий каталог - это каталог, который вы хотите сделать совместимым патчем, вы можете сделать что-то вроде этого:
Извлечь нетронутую версию из subversion в другой каталог (выберите имя каталога, которого не существует, здесь, используя подкаталог 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-репозитория в исходный рабочий каталог; поскольку каталог для извлечения нетронутой Subversion не нужен, вы можете от него избавиться. Ваш рабочий каталог теперь является и 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
, это довольно тривиальная вещь для импровизации. В противном случае это выглядит, возможно, немного грязно. Вы можете обобщить подход, написав скрипт из этих шагов для реализации «интерактивного коммита» или «интерактивного создания патча» для svn, который можно использовать без какого-либо понимания git.