2012-11-02 2 views
5

問題GitとSVN Reposの間のブリッジとしてGitを使用していますか?

私のチームは、私たちのクライアントは、家の中でSubversionを使用して、ビットバケット上のソースコントロールのためにgitを使用しています。コードをSubversionにチェックインしている間、私たちのチームはどのようにgitを使い続けますか?そして、いいえ、私はgit-svnが動作するとは思わない。

私のチームは、純粋なgitのソリューション、ないのgit - SVNを使用したい

要件。これは、私たちのクライアントがオフィスLAN内でのみsvn環境へのアクセスを許可しているからです。私たちはオフィス外で働くときにsvnにコミットすることはできません。

私のアプローチ

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

これはgitがプル後にgit bitbucketリポジトリより先にリビジョンのx個の数字を表示していたために問題だったので、svn dcommitプロセスは終了しました。

私のクライアントがSubversionリポジトリにチェックインを開始し、最終的に私たちのbitbucketインスタンスにプッシュする必要があると確信しています。

技術的な詳細

ここで私はこの作業を取得しようとするために使用してきた段階のラフなシリーズだ:後

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実行:

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

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

ありがとうございます!

答えて

4

あなたのアプローチは正しいですが、dcommitは通常のrebaseよりもさらに混乱して履歴を書き直すことに注意する必要があります。たとえば、svnにdcommittedされている各コミットにgit-svn-id行を追加します。このため、メッセージ内にgit-svn-idを含むコミットが59件あり、いずれもorigin/developに存在しないため、ブランチがorigin/developより先に表示されるのはこのためです。その結果、各dcommitの後、または少なくとも次のdcommitの前にgitブランチをリベースする必要があります。これは、力押し上流の歴史を書き換えることを意味します

git push -f origin develop 

任意の他のブランチは、この上流に基づいていた場合、彼らは今それをリベースしなければならないであろう。

git-svn man pageの「警告」のセクションが詳細に記載されていますので、間違いなく読んでください。

お客様のクライアント側で行われた変更は、git svn rebaseを介して開発ブランチに自動的に組み込まれ、最終的に上記のgit push -fを経由してbitbucketに届きます。

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