私の git-svn リポジトリには、まだ svn リポジトリにコミットしていないローカルでコミットされたパッチがいくつかあります。通常の「git svn dcommit」は、これらのパッチすべてを svn にコミットします。一部のパッチ (単純なバグ修正) のみをコミットし、他のパッチ (テストされていない大きな変更) はコミットしたくありません。git svnでこれを行うにはどうすればよいですか?
3 に答える
私はここで手順に従ってきました:
http://fredericiana.com/2009/12/31/partial-svn-dcommit-with-git/
リベースに慣れている場合は、かなりうまく機能します。
これが私がやったことです。開始点は、svnと同期された「マスター」ブランチであり、すべてのローカルパッチが最上位にあります。
新しいブランチを作成します(wip = Work InProgress)。
git branch wip
これにより、svnにまだコミットされていないすべてのパッチを含む現在のブランチのコピーが作成されます。現在のブランチは「マスター」のままで、変更されません。
リベースを使用して、「マスター」から不要なローカルパッチを削除します。
git rebase -i HEAD~10
これで、「マスター」ブランチに安全にコミットできるパッチが追加されました。
git svn dcommit
「wip」ブランチには、まだ共有する準備ができていない主要な変更があります。実際、私は彼らにそこにとどまってもらいたいのですが、ここで私は立ち止まります。すべてが完了したら、「wip」ブランチからsvndcommitを実行することができます。しかし、完全なものにするために、そして元の質問に答えるために、最後のステップがあります:
を使用してコミットされていない変更を「マスター」ブランチに戻し
git cherry-pick
、最後に。を使用して不要なブランチを削除しgit branch -d wip
ます。
git では、実際には単一の変更セットを操作することは想定されていません。私が知っている最善の方法は、重要な作業のためにローカル ブランチを作成することです。このようにして、テストされていない主要な変更が git リポジトリの別のブランチにまとめられ、それらを非常に簡単に区別できるようになります。
現時点でこれが問題である場合は、svn から最後に更新した時点から新しいブランチを作成し、git-cherry-pickを使用して簡単なバグ修正をこの新しいブランチに転送することができます。 svn にコミットします。
より長期的な観点からは、Subversion トランクから独自の「マスター」ブランチを作成し、次のいずれかを行うのが最善です。
- svn から更新するたびにすべてのブランチをリベースしてから、svn に取得するブランチをマスターにマージし、そこから dcommit します。
- 通常の git-mergeを使用して svn からのものをマージしてから、 で dcommit のためにマスターにマージします。
git diff ..my_branch | patch -p1
これにより、git-svn が処理できない履歴が削除されます。このアプローチは、最終的なマージに関してはより複雑ですが、git 自体でブランチ (および場合によっては他の人) 間でマージすることができます。