2015-11-25 4 views
5

せずに再作成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ブランチを作成することができますが、より良い解決策が存在するかどうかは疑問でした。

+0

'svn-branch'の状態は?それはあなたの期待通りですか?それで、なぜあなたは単に 'svn-branch'の上にgit-edコミットのrebaseを行えないのか分かりません。 'git rebase -i -onto svn-branch 'と言ったら完全な新しい履歴が見えますか? –

+0

@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

+0

私は何かが不足しているかもしれませんが、私がデモしようとしたように、あなたはリベースのすべての点を明示的に定義することができます。'' svn-parent-branch'が 'old-svn-branch-head'から降りてくるわけではなく、あなたのコミットもrebaseにもならないとすれば、私は何の問題も期待しません。しかし、はい、あなたはいつも別の名前の新しいブランチを作成し、この問題を避けることができます。 git-svnは、非連続的なsvnブランチの履歴に厄介です。 –

答えて

2

私は同様の状況に遭遇しましたが、この動作をオフにする方法が見つかりませんでした。(--no-follow-parentは、ブランチトラッキング全体をオフにします。

私はgit replace --graftで履歴を修正しました。置換コミットが作成され、keeps its children unchangedが作成されます。あなたはまだ元のgitk --allオプションでコミット見ることができます

* svn-branch 
| 
* svn-parent-branch 
... 
* old-svn-branch-head 

:置き換え(例:git replace --graft svn-branch svn-parent-branch)した後、これはあなたが見るものです。

* svn-branch (replacement) 
| 
| * svn-branch (original) 
|/| 
* | svn-parent-branch 
| | 
| * old-svn-branch-head 
... 
+0

うわー、私は 'git replace'についてまだ知りませんでした。あなたが私に尋ねるならば、かなりハックのように見える)それにもかかわらず、それは手元の問題のための有用な解決策であるように思われる。 – cmaster

関連する問題