LoginSignup
4
3

More than 3 years have passed since last update.

Encountered 2 file(s) that should have been pointersとなった時の対応方法

Last updated at Posted at 2020-09-24
  • 環境
    • Windows10 Pro バージョン1909
    • git version 2.25.0.windows.1
    • git-lfs/2.9.2 (GitHub; windows amd64; go 1.12.7; git 0274d856)

事象 : Gitをpullしていたりしたらいつの間にか怒られるようになった

リポジトリがリベースされたりしたのでごにょごにょしていたら怒られるようになった。

# 変更していないのに変更したファイルがある・・・
$ git status
On branch {リポジトリ}
Your branch is up to date with 'origin/{リポジトリ}'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   src/main/resources/hogeA.zip
        modified:   src/main/resources/hogeK.zip
# ...省略...
# 変更をなかったコトに!・・・できない
$ git reset --hard HEAD
Encountered 2 file(s) that should have been pointers, but weren't:
        src/main/resources/hogeA.zip
        src/main/resources/hogeK.zip
HEAD is now at 804xxxx ほげほげ

Gitは、音声、動画、高画質な画像などの大きなファイルを扱うことはあまり得意ではありません。Gitリポジトリにそのような大きなファイルを含めると、git clone、git push、git pullの処理に膨大な時間がかかる場合があります。
Git LFS(Large File Storage 以下、LFS) は、前述した問題を解決すべく、GitHub、Microsoft、Atlassian、および他のコントリビュータによって開発されているGitの拡張機能です。これにより、大きなファイルをより効率的に扱うことができるようになります。
Git LFSの使用方法 – Backlog ヘルプセンター

おおぉぉ、.gitattributesファイルを見るとzipファイルはLFSが指定されている。コマンドでも見れる。

 git lfs track | grep -i zip
    *.zip (.gitattributes)

原因1 : ポインタになってないファイルがあるから

チーム内に git-lfs 有効にしてない人がいたり、たまたまマージのタイミングでポインタになってないファイルがあるのが原因です。
Git LFS で次のエラーメッセージが出たときの一発対処法:Encountered 3 file(s) that should have been pointers, but weren't: - Qiita

「ポインタになってないファイル」・・・?

通常、gitは差分を管理しており各クライアントはその差分をGitHubなどのgitリポジトリサーバと共有しています。これに対して、git lfs機能を経由して追加されたファイルはファイルの実体は別のオブジェクトストレージ(図のLarge File Storage)などに保存されそのハッシュ値、保存先だけがgitリポジトリで管理されます。
Git LFSについて調べてみた. チームリポジトリにGit LFSを適用する際の注意点 | by Kota Tsuyuzaki | nttlabs | Medium

対応 : 変更なしと仮定してindexに登録する

# コミットしていないファイルを短縮表示して
$ git status -s
 M src/main/resources/hogeA.zip
 M src/main/resources/hogeK.zip
# 4文字目以降を切り出して
$ git status -s | cut -c 4-
src/main/resources/hogeA.zip
src/main/resources/hogeK.zip
# そのファイルを変更なしと仮定(assume)してindexに登録する
$ git status -s | cut -c 4- | xargs git update-index --assume-unchanged
# そしてコミットしていない変更はなくなった
$ git status
On branch {リポジトリ}
Your branch is up to date with 'origin/{リポジトリ}'.

nothing to commit, working tree clean

原因2 : 自分がGit LFSを有効化していないから

チーム内に git-lfs 有効にしてない人がいたり、たまたまマージのタイミングでポインタになってないファイルがあるのが原因です。
Git LFS で次のエラーメッセージが出たときの一発対処法:Encountered 3 file(s) that should have been pointers, but weren't: - Qiita

「チーム内に git-lfs 有効にしてない人」・・・?私?

# 自分の設定を見てみると・・・lfsの設定がない。
$ git config --global -l | grep lfs
$
# git lfsコマンドが使えるからって有効化されているわけではないんだ・・・。
$ git lfs version
git-lfs/2.9.2 (GitHub; windows amd64; go 1.12.7; git 0274d856)

対応 : Git LFSを有効化する

参考 : Git Large File Storage - アトラシアン製品ドキュメント

# LFSを有効化する
$ git lfs install
Updated git hooks.
Git LFS initialized.
# 設定が追加された
$ git config --global -l | grep lfs
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3