2009-08-21 13 views
6

私はSubversionに飽き飽きしており、独自のリポジトリを破壊しています。私は長い間gitの骨董品だったので、常にそれを試してみたかったので、私はそれを行ってgit-svnを使うことにしました。しかしドキュメントを読んで、私はあなたがそれでgit awesomenessの多くを使うことができないことに気付きました。 git-pullを使うことはできません。ローカルブランチを作成することはお勧めできません。 Subversionを直接使用するよりもあまりよくないように見えます。またはそれは?どのような長所と短所git-svnは、単純なsvnを超えていますか?git-svnの賛否両論は何ですか?

PS。申し訳ありませんが、私はSubversionリポジトリを修正する方法を尋ねていません。それほど気にしません。同じディレクトリ内のすべての.svnとcheckoutを一晩削除すると正常に動作します。私はちょうどどのような利点がgit-svnがテーブルにもたらすことができるのだろうかと思っていた。

+7

あなたは本当にそのような転覆の問題を起こすべきではありません。私たちが管理しているSubversionリポジトリは非常に大きく(1万以上のファイル)、これまで何の問題もありませんでした。ハードウェアの問題のように聞こえる、任意の破損は決して起こらないはずです。 – Kezzer

+3

私はあなたのリポジトリがプログラマでない人には使われていないと思っています。 – vava

+0

@vava:プログラマーでない人は_ _コピーを破ることができ、膨大な作業量を失うかもしれませんが、_ _リポジトリ_を壊すことは間違いありません。何かがそこに魚がいるように見えます。もし私があなただったら、何か他のことをする前にこれがどうなるかを調べようとします。 – sbi

答えて

4

長所:

    Gitは適してい
  • すべて:すべての古いへ
    • ネットワークの自由なアクセスが
    • をコミット素敵ためのSVNへのすべての変更をプッシュするコミットとのGitにリベース(再び、ネットワーク・フリー)、その後git svn dcommitきれいなコミット
    • 安いローカル分岐(わからないあなたはこれがうまく動作しないと言う理由)
  • はあまりSVNに対処する必要はありません :)

短所:

  • はるかに良いワークフローあなたはすでに、彼らはあなたが
  • をやっていることを見ればGitリポジトリとSVN(新しいソース管理ユーザーのための、すなわち、あまりよくありません)
  • 両方が誰を混同することがわかっている場合(例えばSVNなど:キーワード)SVNの
  • 一部の機能は利用できません/
+0

私は大学でSVNを使うことを余儀なくされ、SVNブリッジでGitを使うことを好みます。つまり、SVNが外れるまでGitを十分に活用することはできません。 –

2

git-svnでの私の経験は、主にsubversionリポジトリとgitのようなインターフェイスを使いたい(経験豊富な)git-usersにとって便利なことです。 gitの概念とgit-svnの制限の両方を同化することは、少なくとも私のためにはあまりにも大きかった。

可能であれば、完全にgitに切り替えることをおすすめします。

私は多くの人がSubversionについて不平を言っているのを見ましたが、私が知っている限り、それはかなり安定しています。ハードウェアに問題がないと確信していますか?

+0

はい、私は確信しています:)ファイル名が長すぎたり、コミットの途中で接続が南になったりすると、ときどきブレークします。 2GBのリポジトリを扱うことは、貧弱な破壊には簡単ではありません。あまりにも悪い私は完全にgitに切り替えることはできません。 – vava

+0

あなたはSVNメーリングリストで助けを求めましたか?私は彼らがそのような問題に非常に興味を持っていると思う。 – sbi

+0

それは役に立たない、私はとにかくそれらを表示するテストケースを持っていない。 – vava

0

すべてのsvnリポジトリをgitに移行し、履歴やその他すべてを移行し、gitに完全に移行するのは問題ありません。

2Gbは1つのリポジトリに相当します。それをいくつかの部分に分割する価値がありますか?

+0

残念なことに、私は唯一の従業員ではありません:)そして、プログラマー以外の人々はTortoise SVNをある程度理解することができますが、gitはあまりにも厳しいでしょう。したがってgitに移行することは悲しい選択肢ではありません。 – vava

1

利用がある場合:

  • 「私たちはSVNを保つが、迅速な内部分岐のためのGitリポジトリを持っていない」、git-svnを使用する必要が:直接あなたのsubversionのワークスペースとGitのハックのブランチ内のあなたができる「git init」あなたのコードのその部分の中に直接置いてください。

しかし、これがあるとします。簡単なgit-svnが再現されます

    • 「我々は中央のSVNリポジトリとGitのリポジトリの両方を維持する」ために、そして物事は、もう少し複雑です"SVNブランチ"(実際にはコピーが入った単純なディレクトリ)ですので、私は使用することをお勧めしますsvn2git and git2svn
    • すべてをインポートしようとするは1つのGitリポジトリにあります必ずしも良い考えではありません( "What are the git limits?"参照):あなたのシステムが、互いに独立して開発できる異なるモジュールで構成されている場合、それらは単一のSVNセントラルリポジトリ内に存在することができますが、それぞれ独自のGitリポジトリ必要なモジュールのみを引っ張ることができるようにするため)
1

便利な私はgitのへの変更はあなたの問題を解決しないと思います。あなたの仕事の中に "非プログラマ"がいて、他人を壊してしまった場合(私はディレクトリやファイルの名前を変更/削除することを前提としています)

git-svnやgitなどのVCSを使用していて、ディレクトリの名前を変更/削除しても、どうすればよいでしょうか?

私はVCSの基本的な概念を理解するためにいくつかの人を訓練するべきだと思います。

人々がSVNワークフローを理解していない場合、私は彼らがgit-svnまたはgitをマスターするのではないかと疑います。

+0

だからこそ私はgit-svnの背後に隠れたいと思っています。私はこれを確かに知っていませんが、私はgitをもっと進歩させたと思っています。 – vava

+0

git-svnはファイルを削除して名前を変えてマージしようとすると、複雑さが増し、svnと同じくらい簡単に分解されます。あなたは本当にあなたの問題の原因を探さなければなりません。 –

3

これらは、git-svnを使用しているspesific proとconです。だから、本当にgit自体についてではありません。

プロ:あなたがワイヤ上でコミットする必要があるため

SVNを使用している人々の傾向は、すべてを一度に大きな変更をコミットすることです。この方法は、変更が相互に関連しないことがあるため、悪いことがあります。例:バグ修正や、1つのチェンジセットでコミットされた新しいフィーチャの変更を伴う変更を行うことができます。 gitでは(特に私がネットワークに接続していないときは)私のローカルgitリポジトリに頻繁にコミットし、できるだけ小さなチェンジセットを持っています。私はその後、大きな変更が準備完了したら、svn(git svn dcommitを使って)にコミットします。

コン

リモートリポジトリに競合がある場合は特に、マージされたようにsvnを有するの詐欺。時々痛いことがあります。 IntelliJをIDEとして使用し、競合を解決するためには、コマンドラインを使用して修正する必要があります。私がこの問題に頻繁に遭遇したことを知って、I have documented itそして今それは私のためにもう大したことにはなりません。

+5

あなたのリンクは死んでいます。 –

3

私はgit-svnを使ってgitに移行しました。私たちのsvnリポジトリはまだ未完成ですが、私たちはまだ "git awesomeness"をすべて取得しています。基本的に、git-svnクローンの後に、あなたの 'トランク'として再びブランチします。誰もgitを使ってここから分岐します。あなたがsvnから更新を取得する必要があるときは、単純にgit-svn rebaseを実行してから、svnブランチから新しい 'trunk'にgit merge --squashを実行します。そしてその逆。これはsvnのリポジトリの履歴がgitのwhatsと一致しないことを意味します。あなたが1つ以上のマージを行うと、ある時点で、履歴が一致しないため、グラフトを開始する必要があります。しかし、gitトランクのHEADを最後のコミットIDに移植すると、潰れたマージであっても同じ効果が得られます。

わかりましたので、例を挙げて私ができることをこれで解説しましょう。

のsvnレポ: のsvn:これは、SVNリポジトリと同じ歴史を持つmasterブランチでの通常のgit-svnのセットアップを残す必要があります

git svn clone svn://xyz.com/myproject 

//xyz.com/myproject。

git checkout -b git_trunk 

git_trunkはgitユーザーの "トランク"になります。

このブランチは、他のgitリポジトリと同じように自由に使用できます。

今、あなたはあなたがするために、同じことをするだろう

git checkout git_trunk 
git merge --squash master 
git commit -a 

をgit_trunkするために、マスターのsvnブランチからマージ..例えば--squash

をマージはgit経由でこれら二つのブランチを同期する必要がありますあなたは

git svn dcommit 

を実行します除きこれはSVNに戻ってそれをプッシュします SVNマスターにgit_trunkからマージ。

ここで、複雑な部分は--squashを使用しているためマージ履歴が失われており、共通の祖先gitだけが分岐点であることがわかります。これは、マージの競合を意味します。私がそれを解決する方法は、このような何かをすることでした。

git_trunkからmasterへのマージ。まず、git_trunkの最後のスカッシュのコミットIDを取得します。それをABCDEFGと呼ぶことができます。それから私はgit_trunkのcommit-dを取得します。マージするとき

echo "HIJKLMNO ABCDEFG" > .git/info/grafts 

そのHIJKLMNOを言うことができますこれは、ほとんどの共通の祖先は、最新のつぶれがコミットであることをgitのを教えてくれます。

それは完璧ではありませんが、それは私にとって素晴らしい作品です。特にほとんどの人がgitを使っているためです。

+0

だから、あなたはgitを好きな人が使っているパブリックなgitリポジトリを作りました。そして、しばらくして、それらの人の変更をメインのサブバージョンに変更するだけです。 svnに残っている貧しい人々は、もはや責任を使用することはできません:) – vava

関連する問題