もんりぃ is undefined.

育児ネタとか、技術ネタとか。

git lfs 化したリポジトリで git status すると Encountered N file(s) that should have been pointers, but weren't: って言われる件について

はじめに

  • git lfs 化したリポジトリを複数人で運用している場合の話です。
  • 既存のリポジトリlfs 化したにせよ、新規に構築したにせよ起こり得ます。
  • タイトルが長い!というツッコミは甘んじて受け入れますw

TL; DR

  • git lfs clone しましょう。
  • git clone 済の場合は git lfs install で解決します。

課題

Encountered N file(s) that should have been pointers, but weren't:
    // 以下ファイル名...
  • 複数人 (じゃなくても起こせるけど) で git lfs リポジトリを運用していると上記のようなメッセージに遭遇することがあります。
  • git reset --hard とかしても消えてくれません。
  • git status でずっと怒られた状態になります。困った!

原因

  • じゃあ、なんでそんなことになるのか?
  • 凄く端的に言えば git lfs さんが「ポインタ化すべきファイルあるっぽいけど?」って教えてくれているわけです。
  • これの根本原因は、当該リポジトリにコントリビュートしている人の誰かの環境が git lfs 化されていないからです。
    • git lfs 化されていない環境では、実体ファイルを参照できないので、 git lfs 管理されているファイルが壊れたように見えます。
    • 故に、「あれ?何か壊れてる。戻そう。」みたいな感じでポインタ化ファイル→実体ファイルという感じに戻されたコミットが積まれてしまうわけです。
  • 「え?ちゃんと git lfs add とかもして、 .gitattributes もコミットしたんだけど!?」とか思うんですが、あくまでそれはポインタ化の対象ファイルを列挙したに過ぎず、git lfs のフックを全環境に配信したわけではないのです。
    • git lfs というのは、 git の hooks を駆使して Large File を取り扱う仕組みなので、 .git/hooks/ 以下に hook スクリプトが配信されないとダメなのです。

解決策

  • まだ git clone していない環境の場合は git lfs clone しましょう!
    • これにより、自動的に hook スクリプト達がインストールされた状態になります。
    • 更に git lfs の実体ファイルの取得が高速化する *1 というオマケつき。
  • 既に git clone でローカルリポジトリ作っちゃった場合は、 git lfs install コマンドで hook スクリプトがインストールされます。
    • インストール時のオプションも幾つかあるっぽいけど、調べてない。

*1:git checkout と同時に1件ずつ取得するのでは無く、並列ダウンロードしてくれるので10倍くらい速い。