2009-07-10 15 views
3

私は自分のリポジトリ全体(標準git svn init -t tags -b branches -T trunk $repo_urlファッションで初期化され、次にgit svn fetch edで初期化されました)のgit-svnチェックアウトを取得しました。私は手動でsvn copy $repo_url/branches/branch1 $repo_url/branches/branch2です。私はgit svn fetchgit checkout -b local-branch2 branch2を実行して、branch2dcommitに戻し、branch2で作業しました。 (ブランチをブランチにする理由は?gitでこのブランチをハックしたかったのですが、まだSVNにコミットし、いくつかの同僚の協力を得ています)。git-svn:あるSVNブランチから別のSVNブランチにgitコミットをコピーするには?

をマージすると、branch1に戻ります。私がgit checkout -b local-branch1 branch1、次にgit merge branch2なら、local-branch1のポインタを単に早送りします。branch2の位置にポインタを置きます。

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

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

+0

* "ブランチをブランチにする理由は?"はい。 – naught101

答えて

6

local-branch1にないbranch2の最初のコミットはおそらくbranch2を作成したコミットでしょうか?これは、gitの空のコミットとして表示されるはずです(例えば、メッセージですが、内容はありません)。 sha1識別子をコピーします。次に、local-branch1でgit reset --hard branch2 && git rebase --onto [email protected]{1} SHA1(SHA1はコピーされたsha1)を試してください。これは空のブランチを除くすべてのコミットをブランチ1に戻す必要があります。対話的なrebaseを行い、各コミットを編集したいのでgit-svnが追加するgit-svn-id:行を取り除くことができます(または十分なコミットがあれば、そうするためにgit-filter-branchスクリプトを書くことができます)。

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

+0

すべてがうまくいったように見える、ありがとう。 後で何かを後退させる必要がある場合に備えて、repo(diffsとcommitメッセージ)の各コミットを保存したかったので、スカッシュコミットをしたくありませんでした。私はこのやり方をもう一度考えなければなりませんが、これはちょっと面倒です。 – cbowns

+0

また、友人は私のためにこれを試しました。git-svnはコミットメッセージの既存のgit-svn-id行を無視する方が良いようになりました。間違ったブランチにコミットすることはありません。 – cbowns

+0

もう少しコミットした後、 'git svn info'は間違ったブランチで私をdcommittingのために再び見せてくれました(ブランチ2に私がいました)。私はチェリーピックアップしてブランチ1に戻った後、 'git checkout masterをやった。 git reset --hard branch1'を実行して、元の場所に戻してください。 – cbowns

関連する問題