僕はgit管理アプリの fork の大ファンなのだけどgitの仕様バグみたいなものでforkの動作がおかしくなる条件を発見したので、ちょっとメモとして残しておく。
- リポジトリAがあり、リポジトリBがある、BはAからforkされたもので、外注さんとのやりとりのために使うリポジトリである。
- リポジトリAがいろいろな都合でLFSを使いだす。
LFSを知っている人なら、.gitattributeが作られるとクライアント側でLFSがオンになるというのは知っているだろう。
.gitignoreと似た構造だが、1つ大きく違うのはgitignoreはサーバーにモノを上げるか上げないかを決めるルールだが .gitattributeはサーバー上でLFS Objectにするかを決めるルールだってことだ。
そしてLFSは結構頭が良くてサーバー上でupstream側から取得しようとしたオブジェクトがLFS Objectだと、スルっとautomaticでダウンロードしてくれる ことになっている。
では リポジトリBで別段LFSをオンにせずに upstream、つまりAからLFSを使っているブランチをpullしたとき何が起こるか?
fork君はLFSをクライアント側でオンにせずにLFSの入っているリポジトリをpullするとLFS Objectをautomaticに引っ張ってくれない挙動をするのである。
結論
LFSではなかったリポジトリからLFSのリポジトリを引っ張るときは、まず先にLFS Initを実行して、LFSが有効になるようにしてから引っ張りましょう。
なお、.gitattributeの処理はclient側の話なので、clientの作りによって変わる。そしてsource treeは なんだかDLされていないLFS ObjectがあるようだけどDLするかい? とダイアログを出して聞いてくる。
少々気が利いている…利いているがだ。知っての通りwindows 版のsource treeはあまりに ナニ なので使いたくないのである。