これは、git-svn を使用した通常のワークフローです。
- 問題のブランチを作成する
- ブランチで何らかの作業を行った後にコミットする
- チェックアウトマスター
- svn リベース
- チェックアウト ブランチ
- リベースマスター
- チェックアウトマスター
- マージブランチ
- コミットしない
ここでの私の目標は、履歴を一直線に並べることと、マージの頭痛の種を最小限に抑えることです。
より少ないステップでこれを行う方法はありますか?
ここで 2 つのことが矛盾しています。履歴を一直線に保つには、リベースする必要があります。ただし、リベースは、別のコード ベースの上に変更を再適用する必要があることを意味します。これにより、リベースするコミットごとに一連の競合解決が必要になる場合があります。
あなたを助けるために私が追加できる唯一のことは、リベースした場合、早送りマージがあることを知っているということです. この場合、そのブランチをチェックアウトして前進させる必要はありません。したがって、参照を更新するには、次のことができます。
git push . my-branch:master
これにより、 master が my-branch が指している場所を指すように更新され、早送り可能な場合にのみ機能します。残念ながら、必要なアクションを実行するにはブランチにいる必要があるため、ここでは役に立ちません。
ワークフローの問題に戻ると、単純にマージする場合よりも競合の問題が多くなります。
git-svn の代わりにSubGitを試すことができます。
SubGit はサーバー側のソリューションです。これにより、Subversion リポジトリへの Git アクセスと、Git リポジトリへの Subversion アクセスが可能になります。SubGit を Subversion リポジトリにインストールする必要があります。つまり、基本的に、すべてのプッシュとコミットで変換を行う必要なフックを追加します。
$ subgit configure $SVN_REPOS
$ # Adjust $SVN_REPOS/conf/subgit.conf
$ # to specify your branches and tags
$ # Adjust $SVN_REPOS/conf/authors.txt
$ # to introduce svn author names to their git counterparts
$ subgit install $SVN_REPOS
その後、$SVN_REPOS/.git に Git リポジトリがあり、対応する Subversion と継続的に同期されます。この Git リポジトリにリモート アクセスが構成されている場合 (例: git-http-backend経由)、任意の Git ワークフローと任意の Git クライアントを既存の Subversion リポジトリで使用できます。
あなたの場合、次のようになります。
$ git checkout -b foo
$ git commit
$ git checkout master
$ git merge foo or git rebase foo
$ git push
詳細:
途中でリベースを行う必要はありません。また、そうするために master ブランチにスワップする必要もありません。私のワークフローは同じことを達成するため、次のようになります。
問題のブランチを作成します: git checkout -b issue remotes/trunk
(remotes/trunk
興味のあるブランチに既にいる場合は省略できます)。
いくつかの作業を行い、コミットします。
Subversion リポジトリに直接プッシュします: git svn dcommit
. これは、編集したファイルが変更されている場合にのみ失敗します。持っている場合は、エラーが発生するので、 を実行してから、もう一度やり直しgit svn rebase
てくださいgit svn dcommit
。
最初にこれを master ブランチにマージする必要はないことに注意してください。
master ブランチをチェックアウトします: git checkout master
.
master ブランチをリベースします: git svn rebase
.
必要に応じて、課題ブランチを削除します。git svn dcommit
master ブランチと issue ブランチは、git svn rebase
直後と同じように同一になるはずです。
git svn
どのブランチからでもコマンドを実行できます。システムは、親の Subversion ブランチに基づいて、どこにコミットまたはリベースするかを判断します。関心のある Subversion ブランチを確認したい場合は、次を実行します。git svn dcommit --dry-run
特に、master ブランチについては特に特別なことはありません。実際、私はよくそれを無視して、上記のステップ 4 ~ 5 をスキップします。ある問題ブランチから別の問題ブランチに交換するだけで、マスター ブランチを Subversion のヒントまで持ち出すことは決してありません。