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