私はgit-svnリポジトリにローカルにコミットされたパッチをたくさん用意していますが、まだ私のsvn repoにコミットしていません。通常の "git svn dcommit"はこれらのパッチをすべてsvnにコミットします。パッチ(単純なバグ修正)だけをコミットしたいが、他のもの(テストされていない大きな変更)はコミットしたくない。どうすればgit svnでこれを行うことができますか?git svnで選択したパッチのみをdcommitする方法は?
答えて
これは私がやったことです。開始点はsvnと同期された "マスター"ブランチであり、私のローカルパッチはすべて上にあります。
新しいブランチを作成します(wip = Work In Progress)。
git branch wip
これは、まだsvnにコミットされていないすべてのパッチを含む、現在のブランチのコピーを作成します。現在のブランチは「マスター」として残り、変更されません。
リベースで「マスター」から不要なローカルのパッチを削除します。
git rebase -i HEAD~10
今「マスター」ブランチは、安全にコミットできるパッチがあります
git svn dcommit
「WIP」ブランチには大きな変更があり、まだ共有する準備ができていません。実際には、私は彼らがそこにとどまるようにしたいとこれは私が停止する場所です。すべてがファイナライズされたら、 "wip"ブランチからsvn dcommitを実行することができます。しかしcompletess'ために、元の質問に答えるために、最後のステップがあります:
は
git cherry-pick
を使用して戻って 『マスター』ブランチにコミットされていない変更を引き、最後にgit branch -d wip
で役に立たない枝を取り除きます。
gitでは、実際には単一のチェンジセットで操作するつもりはありません。私が知っている最善のアプローチは、自明ではない作業のためにローカルブランチを作成することです。このようにして、テストされていない大きな変更はgitリポジトリの異なるブランチで終わり、それらをかなり簡単に区別することができます。
これが問題であれば、おそらくsvnから最後に更新したポイントから新しいブランチを作成し、次にgit-cherry-pickを使用して簡単なバグ修正をこの新しいブランチに転送することができます。 svnにdcommitします。それはsubversionのトランクから作られた独自の「マスター」ブランチを持っている最高のビューのより長期的な観点から
、および次のいずれか
- 、その後、すべての枝にあなたがSVNから更新するたびにリベースsvnに行きたい人をあなたのマスターにマージし、そこからdcommitしてください。
- 普通のgit-mergeを使ってsvnからのものをマージし、dcommitsのためにマックに
git diff ..my_branch | patch -p1
というものをマージすると、git-svnが処理できない履歴がなくなります。この方法は最終的なマージではもっと複雑ですが、git自体でブランチ間(そしておそらく他の人たち)にマージすることができます。
私はここの手順に従っててきた:
http://fredericiana.com/2009/12/31/partial-svn-dcommit-with-git/
あなたが快適にリベースしている場合、それはかなりうまく動作します。
最後のステップは、「git pull .wip」です。元の質問を満たすために、witブランチからのすべての変更を取り込むだけです.git-cherry-pickを使用する必要があります。 –
マーク、それを指摘してくれてありがとう。私は代わりにチェリーピックを使用するように投稿を編集しました。 "git pull .wip"に続いて "git svn rebase"を使うと、自動的に衝突が解決されますが、cherry-pickを使う方が良いでしょう。 –