中央リポジトリ(bareリポジトリ)の作り方2パターンを理解する

絶賛、git思い出し中。

たしか大事だった気がする、リポジトリの共有に関連するポイントをまとめておきます。

中央リポジトリは「--bare」で作成

中央リポジトリを作成する(init)ときとか、既存のリポジトリを中央リポジトリとしてクローンする(clone)ときとかに「--bare」を使う。
ちなみにbareレポジトリは「xxx.git」という拡張子で記載するのが基本ルール。

bare

--bareオプションは、以下のヘルプのとおり、ワーキングディレクトリ(実際のファイル群)を持たないリポジトリとして作成できる。

Treat the repository as a bare repository. If GIT_DIR environment is not set, it is set to the current working directory.


そして、中央リポジトリを作成するとき、然るべきユーザがアクセスできるよう「--shared」というオプションを使うのだが、これがちょっと注意。

新規で「init」するときは「--shared」する

shared

init の --sharedオプションは、リポジトリに対するグループ書き込みパーミッションを自動的に追加してくれる。
これは実際には「When specified, the config variable "core.sharedRepository" is set so that files and directories under $GIT_DIR are created with the requested permissions.」ということで、これ↓を実行しているのと同じ。

$ git config core.sharedrepository true

手順

  1. git init --bare --shared
  2. 作業場所に「clone」
  3. first commit
  4. 中央リポジトリに「push -f」

※ブランチが存在しないところにfirst commitを投げることになるので、--force での強制pushが必要

既存リポジトリから「clone」するときは「--shared」しない(ほうが無難)

initと同じテンションで clone --shared していたことがあるのだけど、これはヘルプで「危険だからよく分かってない人は使うな」とNOTEされている。
clone の --shared は、「クローン元がローカルにある場合に、クローン元のオブジェクトを共有する(から、クローン先は独自のオブジェクトを持たずにいける)」という意味らしい。

そもそもclone時に、ソースリポジトリ(クローン元)がファイル形式(ローカルのパス)の場合は、「--local」オプションが自動で適用される。
この「--local」は、オブジェクトがハードリンクになってディスクの節約になるという動きをしてくれる。
ハードリンクは「ソースリポジトリのURL」ではなくそれが指している「実体」にアクセスするので、ということは、クローン先で変更をかけたらクローン元でも反映されているということ(だと思う)。バックアップなど通常のコピーを持ちたい場合は「--no-hardlinks」を使う。

「--shared」というのは、これを「.git/objects/info/alternates」というのを使ってハードリンクではない方法(シンボリックみたいなものなのかな?)でソースリポジトリのオブジェクトを参照してくれる。
ただし、この状態でソースリポジトリでブランチを消したりすると、参照が壊れたり、クローン先のリポジトリが破壊されたりすることがあるらしい。
いまいち仕組みがよくわからないけど、つまり「clone --shared」とするのは「閲覧用」ということになるのかしら?

手順

そういうわけで、既存リポジトリからcloneして中央リポジトリを作成する時は、こういう手順になる。

  1. 既存リポジトリに「git clone --bare」
  2. 作成した.gitファイル内で「git init --bare --shared」

これが公式のbooksに書いてあるやり方。

もしくは、2. の代わりに以下を行うというのも大丈夫だと思う。
現場では動作確認をしたのがこちらのやり方だったので、こっちでやってた。

$ git config core.sharedrepository true
$ chmod -R g+ws hooks
$ chmod -R g+ws info
$ chmod -R g+ws objects
$ chmod -R g+ws refs

gitヘルプ

gitはヘルプがめっちゃ優秀なので、ググって野良記事を探してもいいけど信頼すべきはこっち。

git-scm.com

git-scm.com