せずに再作成SVNブランチをフェッチ:GIT SVN:私は私の上流<code>svn</code>リポジトリと、次のような状況を持っている間違ったマージ親
私はsvn
ブランチを作成し、本当に複雑な歴史につながったことにいくつかの作業を行いました。だから私はgitコミットを保持して、もう一度それを削除し、私は歴史をきちんと整理することができました。
パッチシリーズを準備したら、svn copy
を使用してブランチを再クローズし、次にgit svn fetch
を再クローンしました。アイデアは、新しいsvn
ブランチにクリーンアップされた履歴をリベースして、git svn dcommit
で簡単に公開できるようにすることでした。
しかし、git svn fetch
は私が期待したことをしませんでした。これは私が(偽git log --oneline --decorate --graph
出力)期待したものである:
* xxxxxxx (svn-branch)
* xxxxxxx (svn-parent-branch)
...
somewhere further down, unrelated to the above
* xxxxxxx (old-svn-branch-head)
しかし、これは私が得たものである:
* xxxxxxx (svn-branch)
|\
| * xxxxxxx (svn-parent-branch)
|
* xxxxxxx (old-svn-branch-head)
ご覧のとおり、git svn fetch
は完全にマッピングし、svn
ブランチが削除されたという事実を無視しますsvn
を再作成して、マージコミットをコミットしてgit
にコミットします。しかし、残念ながら、接続が間違っていると、git
のマージアルゴリズムが混乱し、新しいブランチベースコミットを介してリベースするときに偽のマージ競合が発生します。
git svn fetch
は、ブランチベースの新しいコミットを間違った親とリンクさせないようにするにはどうすればいいですか?git svn dcommit
で私のものを公開する方法で私のgitリポジトリを修正しますか?もちろん、私はいつもすべてをもう一度削除し、別の名前の新しいsvn
ブランチを作成することができますが、より良い解決策が存在するかどうかは疑問でした。
'svn-branch'の状態は?それはあなたの期待通りですか?それで、なぜあなたは単に 'svn-branch'の上にgit-edコミットのrebaseを行えないのか分かりません。 'git rebase -i -onto svn-branch'と言ったら完全な新しい履歴が見えますか? –
@MykolaGurov 'svn'ブランチはOKです。 'svn rm'で古い状態を削除し、' svn copy'でブランチを再作成しました。どちらも純粋な 'svn'操作であり、どちらも期待された結果を正確に示しています。また、期待通りに 'git diff svn-parent-branch svn-branch'は出力を生成しません。しかし、 'svn-parent-branch'から' svn-branch'への再バインド時に、 'old-svn-branch-head'による偽の接続のためにマージ競合が発生します。再帰的なマージ戦略は間違った接続に基づいて間違ったマージベースを計算しているようです(これは非常にアクティブなプロジェクトです)。私はそれが非常に独特の状況だと知っています:-( – cmaster
私は何かが不足しているかもしれませんが、私がデモしようとしたように、あなたはリベースのすべての点を明示的に定義することができます。'' svn-parent-branch'が 'old-svn-branch-head'から降りてくるわけではなく、あなたのコミットもrebaseにもならないとすれば、私は何の問題も期待しません。しかし、はい、あなたはいつも別の名前の新しいブランチを作成し、この問題を避けることができます。 git-svnは、非連続的なsvnブランチの履歴に厄介です。 –