mike-neckのブログ

Java or Groovy or Swift or Golang

Gerrit の repo ツールで、複数のサブマニフェストで同一リモートから同一プロジェクトをフェッチした場合のディレクトリー構造

単なるメモ

  • repo でクローンする場合は、 git init のあとにリモートを設定して、 git fetch している
  • その際にgitオブジェクトはフェッチしたプロジェクトの .git ディレクトリーではなく、 .repo/project-objects ディレクトリーの下に リモートの名前、プロジェクトのディレクトリーから計算されるディレクトリーに Git オブジェクト専用の .git ディレクトリーが作られる
  • 上記のGit オブジェクト専用のディレクトリーへは Git 標準仕様にある objects/info/alternates というファイルをもって参照することでディレクトリーを解決する
  • サブマニフェスト構成のマニフェストにおいて、同じプロジェクトが同じリモート、ディレクトリーに配置される場合、同じ Git オブジェクトのディレクトリーを参照するので、フェッチの通信量を抑えられる
  • すでに一度 repo sync した後で、リモート名を変更すると、プロジェクトの .git ディレクトリーを破棄して新しい .git ディレクトリーを作成し、Git オブジェクト専用の .git ディレクトリーも新しいものを作成する
    • 古い Git オブジェクト用 .git ディレクトリーは破棄しない
  • 古いバージョンの repo では、サブマニフェスト構成で複数のサブマニフェストが同じプロジェクトを同じリモートから同じパスで取得してる場合に、上記のディレクトリーの作り直しが失敗するケースがある(v2.41 以前)