2011-08-09 49 views
4

svnリポジトリから新しいgit repoが作成されました。 git repoは現在、さらなる開発が行われる主要リポジトリです。このレポはホストされたものです。 反対側のsvn repoは、非gitユーザーへの公開パイプラインとして残っています。 問題は、git repoからsvn repoを時々更新する方法ですか?私はgit-svnについて多くのことを読んでおり、マージなどは使用しないでください(Is git-svn dcommit after merging in git dangerous?参照)。 しかし、gitリポジトリではマージが行われ、git repoでの開発を奇妙なルール(「リベースのみが許可されている」など)で制限したくありません。git-svn:git repoとsvn repoを同期して維持する

質問は簡単です:svn repoをgit repoと同期させる方法のベストプラクティスですか(隔週で言えば)。変更をsvnからgitに安全に再送することも可能です(svn repoに緊急修正を適用する必要がある場合に備えて、これはまれに起こります)。

新しいgit repoはホストされているので、中間にsvn-gitリポジトリがメディエータとして動作する必要があります。このレポはgit-mergeをgit-rebasesなどに "rewire"するために使用できます。また、すべての中間gitコミットが1つのBLOBとしてSVNにコミットされていることも完全にうまくいきます。

答えて

1

Gitリポジトリに任意のマージを行うことができます。ただし、ブランチをSVNにコミットする必要はありません。
そのブランチの履歴を書き換えない限り、Gitリポジトリワークフローは自由に管理できます。

ベストプラクティスは、SVNリポジトリと同期するブランチの数を最小限に抑えることです。これらの "パブリック"ブランチ(すべてのgitユーザーおよびすべてのsvnユーザー)。

2

私はわずかに異なるセットアップを持っています:SVNリポジトリはGitリポジトリからクローンされません。

私のGitリポジトリは、主に2つのブランチ:mastersvnを持っています。 masterはリモートの裸のGitリポジトリと同期しており、svnはリモートのSVNレポにリンクしています。

git cherry-pickを使用して一方の側から他方の側へコミットを適用し、リベースとマージに問題はありません。

mastersvnにマージしようとしましたが、いつも無限の競合解決セッションが終了しました。チェリーピッキングを使用するだけで、人生ははるかに簡単です。

mastersvnコミットを取得するには、私は次のようにします。

まず、その上流と同期して、両方の枝を取得:

git checkout svn 
git svn rebase 

git checkout master 
git pull 

その後(masterでありながら):

gitk svn 

gitkのウィンドウが表示され、転送するコミットをsvnからmaster。次に、git pushを使用してリモートにコミットを適用します。

masterからsvnへの変更を取得するには、git checkout svnを入力してからgitk masterを開始します。もう一度、転送するコミットを選択し、完了すると、git svn dcommitはコミットをSVNサーバーにプッシュします。

シンプルで無痛です。

+0

本当にinteresstingの音 - gitk "transport tool" ;-) 私はこれを機会に与えます! – Udo

+0

@Udo:もちろん、コマンドラインと 'git cherry-pick'を使うこともできますが、私はGUIをもっと便利だと思います。 TortoiseGitを使用している場合、一度に複数のコミットを選択して選択することもできます。 – eckes

関連する問題