2012-05-18 11 views
6

SVNリポジトリを複数のgit reposに変換しようとしています。これまで私はをSVNの各プロジェクトに使用していました。私はgitがsvnコピー操作に従っていないように見えるので、結果の履歴は私が期待するよりもはるかに簡単です。私のSVNのレポはこのように見えたとしますgitに変換するときにsvnのコピー履歴を保持する

ルート

  • B
  • C
  • 親-projの
    • B
    • C
プロジェクト b

cは最近、最終的にはルートの下に彼らの古い場所から削除することを意図して、リストラの一環としてparent-projの下にコピーされました。私がgit svn clone http://svnhost/parent-projを実行すると、移動前に/b/cに由来するすべての履歴が欠落しています。

これはgit-svnの制限ですか、この履歴を私のレポに表示する方法はありますか?私の限られた研究から、Getting complete history of an SVN repo that's been renamed using git-svnに記載されているようなfilter-branchコマンドを使用すると、私のケースでは恐らく事態を複雑にする複数の親が存在すると思われます。最初にリポジトリ全体を複製し、それから新しいリポジトリを分割することができました(フィルタブランチを使用して)?よりよいアプローチですか?

+0

ディレクトリを移動しても、すべてのファイルの責任履歴が取得されています。そして、私の 'git svn clone 'は、クローンされているディレクトリの外のプロジェクト(どこから由来したものか)も追跡しました。 –

+2

@ShadowCreeper:どのバージョンのGitを使っていましたか?私はPatrickと同じ問題を抱えています – Pylinux

+0

私は彼らがどのバージョンでクローンされたのか分かりません。私はそれがもともとは1.7リリースだったと信じています(Debian wheezyの最新バージョンでは数ヶ月前です)。しかし、私は最近、v1.8.4を使って乱雑な履歴を持つプロジェクトの1つを再クローンし、同じ振る舞いをしました(いくつかのSHAは完全に異なるツリーです)。たぶん、SVNサーバーのバージョンがより重要ですか?私はそれがまだ1.7であると信じています。 –

答えて

0

の場合、bまたはcのコピー先の親プロジェクトの履歴は表示されません。 git svnは、あなたの提供されたベースパスを、SVNをコミットすることに関心のある最も浅いポイントとして解釈し、Gitをコミットします。 bcという履歴コミットがこのパスの外側にあるため、git svnはそれらをミラーリングしないため、その履歴はありません。

git svn init --no-minimize-urlオプションのドキュメントを見てみましょう:(、--branches、または--tagsオプションを使用して--stdlayout)複数のディレクトリを追跡し、GitのSVNが接続しようとすると

サブバージョンリポジトリのルート(または最高許容レベル)。このデフォルトでは、プロジェクト全体がリポジトリ内で移動された場合の履歴の追跡が向上しますが、読み取りアクセス制限が設定されているリポジトリに問題が発生する可能性があります。 --no-minimize-urlを渡すことで、git svnは、上位のディレクトリに接続しようとせずにURLをそのまま受け入れることができます。このオプションは、URL /ブランチが1つしか追跡されていない場合は、デフォルトではオフになっています(ほとんど役に立ちません)。あなたのcloneコマンド以来

は、そのパスと下向きに関わるコミットし、(あなたは、複雑な、マルチプロジェクトまたは非標準的なレイアウトを持っているかもしれないので)git svnだけのクローンを複数のブランチを指定していません。コメント内のShadow Creeperは、-sまたは--stdlayoutオプションを使用しました。これは、いくつかの履歴が保存された理由を説明するものです。

ワンタッチ変換(SVNからGitへの片方向移動)の場合は、リポジトリ全体をクローンする必要があります歴史的な支店やタグの確立を含む。 filter-branchを動かす動機がリポジトリのスペースを節約することであれば、これが実際にあなたに何かを保存していることと、それが厄介なことであることを確認してください。 Gitは非常に効率的です。

最後に、Gitクローンの履歴検索の際に注意してください。 git log -C --follow <file-path>を使用してファイルの履歴を探し、Gitは通常、名前を変更して名前とコピーを組み込んだ履歴を探し出して提供します。ディレクトリにも同じことを期待しないでください。 parent-proj/b。 Gitはブロブ(ファイル)、ツリー(ブロブ)、コミット、および親コミットを追跡しますが、SVNと同じ方法でディレクトリやディレクトリコピーを処理しません。

関連する問題