5

問題

私のチームはビットバケットのソース管理にgitを使用しており、クライアントは社内でSubversionを使用しています。コードをSubversionにチェックインしている間、チームはどのようにしてgitを使い続けることができますか?そして、いいえ、git-svnは機能しないと思います。

要件

私のチームは、git-svnではなく純粋なgitソリューションを使用したいと考えています。この理由は、クライアントがオフィスLAN内でのみsvn環境へのアクセスを許可しているためです。オフィスの外で作業しているときは、svnへのコミットを行うことはできません。

私のアプローチ

git-svnを使用してSubversionリポジトリをチェックアウトし、bitbucketgitインスタンスをリモートとして同じgitでラップされたsvnリポジトリに追加できると思いました。次に、cronジョブはgit pullbitbucketリポジトリからを実行し、次にagit svn dcommitを実行してbitbucketの変更をクライアントのSubversionリポジトリにプッシュします。

これは、pull、svn dcommitプロセスが終了した後、gitが常にgitbitbucketリポジトリよりも'x'回前のリビジョンであると表示するため、問題がありました。

外見上奇妙なことはまだ何も起こっていませんが、ある時点で、クライアントがSubversionリポジトリへのチェックインを開始し、最終的にビットバケットインスタンスにプッシュする必要があると確信しています。

技術的な詳細

これを機能させるために私が使用してきた一連の大まかな手順は次のとおりです。

git svn clone -s http://svn.my-client.us/my-proj/
cd my-proj
git remote add origin path-to-bitbucket-repo
git fetch origin
git checkout -b develop remotes/develop
git branch --set-upstream develop origin/develop
git pull
#add merge comment here
git svn rebase
git svn dcommit #takes a while to transfer all the individual commits

上記のすべての後、実行git status

[me@dev myDir]$ git st
# On branch develop
# Your branch is ahead of 'origin/develop' by 59 commits.
#
nothing to commit (working directory clean)

オフィスにいる間だけでなく、どこからでもチェックインできるようにする必要があるとすると、これを行うためのブリッジとして使用するための戦略はありますか?

ありがとう!

4

1 に答える 1

4

あなたのアプローチは正しいですがdcommit、通常よりもさらに破壊的に履歴を書き換えることに注意する必要がrebaseあります。たとえば、git-svn-idsvnにコミットされた各コミットに行を追加します。これが、developブランチが前に表示される理由です-メッセージにorigin/develop含まれるすべてのコミットが59あり、これらのいずれもに存在しないためです。その結果、各dcommitの後、または少なくとも次のdcommitの前に、gitブランチをリベースする必要があります。これは、アップストリームの履歴を書き換えるために強制的にプッシュすることを意味します。git-svn-idorigin/develop

git push -f origin develop

他のブランチがこのアップストリームに基づいていた場合、それらは今、それに基づいている必要があります。

git-svnmanページのCAVEATSセクションで詳細が説明されているので、必ずお読みください。

svn側でクライアントが行った変更は、を介して開発ブランチに自動的に組み込まれ、git svn rebase最終的には上記を介してbitbucketに到達しgit push -fます。

この種のワークフローで満足できない場合は、SubGitを検討する価値があるかもしれません。私はそれを試したことがありませんが、2つのSCM間の統合がはるかに制限されていないと主張しています。

于 2012-11-08T00:22:31.820 に答える