3

リポジトリ全体のgit-svnチェックアウトがあります(標準的な方法で初期化されてgit svn init -t tags -b branches -T trunk $repo_urlから、git svn fetchedになります)。手動でsvn copy $repo_url/branches/branch1 $repo_url/branches/branch2。次に、を実行しgit svn fetchgit checkout -b local-branch2 branch2にいくつかのコミットを行いbranch2dcommitそれらをSVNリポジトリに戻し、での作業を完了しましたbranch2。(なぜブランチをブランチするのですか?gitでローカルにこのブランチをハックしたかったのですが、それでもSVNにコミットして、作業中に数人の同僚から助けを得ました)。

私が行っていないのは、branch2作業をにマージして戻すことbranch1です。もし私がそうならgit checkout -b local-branch1 branch1、それは単に私のポインタをどこにあるかgit merge branch2へと早送りします。local-branch1branch2

代わりに、ブランチ1を開始してから行われたすべてのコミットをgitで再生して、各コミットをbranch2SVNリポジトリにコミットできるようにします。これを行う方法があるようですが、私はそれを考えることができません。たぶんgit rebase、またはgit cherry-pickで行われた各コミットのbranch2?(後者は少し退屈ですが)。2つのURLをsvnマージしたくないのは、それが大きな打撃となるからです。

アイデア?これのどの部分にももっと説明が必要ですか?

4

1 に答える 1

6

local-branch1 にない branch2 の最初のコミットは、おそらく branch2 を作成したコミットです。これは、git では空のコミットとして表示されます (例: メッセージはあるがコンテンツはありません)。その sha1 識別子をコピーします。次に、local-branch1 で試しますgit reset --hard branch2 && git rebase --onto local-branch1@{1} SHA1(SHA1 はコピーされた sha1 です)。これにより、ブランチ 1 に戻る空のコミットを除くすべてのコミットがリプレイされるはずです。おそらく、インタラクティブなリベースを実行して各コミットを編集し、git-svn が追加する git-svn-id: 行を取り除くことができます。 (または、十分なコミットがある場合は、そうするために git-filter-branch スクリプトを作成することもできます)。

好奇心から、なぜ各コミットを再生したいのですか? 単純に変更をマージしたい場合は、はるかに簡単ですgit checkout local-branch1 && git merge --squash branch2 && git commit。これは非早送りマージを行いますが、実際にはマージコミットを生成しません (git-svn を混乱させるため)。代わりに、マージが発生したかのように同等の作業ツリーを生成しますが、親は 1 つだけです。これは、svn のマージがどのように機能するかを反映しています。

于 2009-07-10T21:39:03.123 に答える