私は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を使っているためです。
あなたは本当にそのような転覆の問題を起こすべきではありません。私たちが管理しているSubversionリポジトリは非常に大きく(1万以上のファイル)、これまで何の問題もありませんでした。ハードウェアの問題のように聞こえる、任意の破損は決して起こらないはずです。 – Kezzer
私はあなたのリポジトリがプログラマでない人には使われていないと思っています。 – vava
@vava:プログラマーでない人は_ _コピーを破ることができ、膨大な作業量を失うかもしれませんが、_ _リポジトリ_を壊すことは間違いありません。何かがそこに魚がいるように見えます。もし私があなただったら、何か他のことをする前にこれがどうなるかを調べようとします。 – sbi