絶賛、git思い出し中。
たしか大事だった気がする、リポジトリの共有に関連するポイントをまとめておきます。
中央リポジトリは「--bare」で作成
中央リポジトリを作成する(init)ときとか、既存のリポジトリを中央リポジトリとしてクローンする(clone)ときとかに「--bare」を使う。
ちなみにbareレポジトリは「xxx.git」という拡張子で記載するのが基本ルール。
新規で「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
手順
- git init --bare --shared
- 作業場所に「clone」
- first commit
- 中央リポジトリに「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して中央リポジトリを作成する時は、こういう手順になる。
- 既存リポジトリに「git clone --bare」
- 作成した.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