git-svn: как скопировать коммиты git из одной ветки SVN в другую? - PullRequest
3 голосов
/ 11 июля 2009

У меня есть git-svn checkout всего моего репо (инициализируется стандартным способом git svn init -t tags -b branches -T trunk $repo_url, затем git svn fetch ed). Я вручную svn copy $repo_url/branches/branch1 $repo_url/branches/branch2. Затем я запустил git svn fetch, git checkout -b local-branch2 branch2, сделал несколько коммитов на branch2, dcommit вернул их в репозиторий SVN, и моя работа над branch2 завершена. (Зачем ветвить ветку? Я хотел взломать эту ветку локально в git, но все же вернуться к SVN и получить помощь от пары коллег, пока я работал над ней).

Чего я не сделал, так это слияния работы branch2 с branch1. Если я git checkout -b local-branch1 branch1, то git merge branch2, он просто переместит мой local-branch1 указатель туда, где branch2.

Вместо этого я хочу, чтобы git воспроизводил все коммиты, сделанные с момента запуска branch2 на branch1, чтобы я мог dcommit каждого из них в репозиторий SVN. Кажется, что есть способ сделать это, но я не могу думать об этом. Может быть git rebase или git cherry-pick каждого коммита, сделанного на branch2? (хотя последнее немного утомительно). Я бы предпочел, чтобы svn не объединил два URL вместе, так как это большая куча вреда.

Идеи? Любые части этого требуют большего объяснения?

1 Ответ

6 голосов
/ 11 июля 2009

Первый коммит на branch2, который не на local-branch1, по-видимому, это коммит, который создал branch2, да? Это должно выглядеть как пустой коммит в git (например, сообщение, но без содержимого). Скопируйте его идентификатор sha1. Затем в local-branch1 попробуйте git reset --hard branch2 && git rebase --onto local-branch1@{1} SHA1 (где SHA1 - скопированный sha1). Это должно воспроизвести все коммиты, кроме пустого, обратно на ветку 1. Теперь вы, скорее всего, захотите сделать интерактивную перебазировку и отредактировать каждый коммит, чтобы вы могли удалить строку git-svn-id:, которую добавляет для вас git-svn (или вы можете написать скрипт git-filter-branch для этого, если достаточно коммитов).

Из любопытства, почему вы хотите воспроизвести каждый из коммитов? Если вы хотите просто объединить свои изменения, это намного проще, вы можете просто сделать git checkout local-branch1 && git merge --squash branch2 && git commit. Это сделает слияние без ускоренной перемотки вперед, но на самом деле оно не произведет фиксацию слияния (поскольку это сбивает с толку git-svn). Вместо этого он создаст эквивалентное рабочее дерево, как если бы произошло слияние, но только с одним родителем. Это отражает работу SVN слияния.

...