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


- 環境
    - 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していたりしたらいつの間にか怒られるようになった
リポジトリがリベースされたりしたのでごにょごにょしていたら怒られるようになった。

```bash
# 変更していないのに変更したファイルがある・・・
$ 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の使用方法 &ndash; Backlog ヘルプセンター](https://support-ja.backlog.com/hc/ja/articles/360038329474-Git-LFS%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)

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

```bash
 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](https://qiita.com/kazuki-ma/items/782cd1cd7eca2fe988b7)

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

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

```bash
# コミットしていないファイルを短縮表示して
$ git status -s
 M src/main/resources/hogeA.zip
 M src/main/resources/hogeK.zip
# ４文字目以降を切り出して
$ 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
```

- 参考
    - [git status -s でちょっと幸せになれる - Qiita](https://qiita.com/tommy_aka_jps/items/af536a7c20747f99aa42)
    - [【 cut 】コマンド――行から固定長またはフィールド単位で切り出す：Linux基本コマンドTips（60） - ＠IT](https://www.atmarkit.co.jp/ait/articles/1610/31/news026.html)
    - [Git - git-update-index Documentation](https://git-scm.com/docs/git-update-index#_using_assume_unchanged_bit)

# 原因2 : 自分がGit LFSを有効化していないから
> チーム内に git-lfs 有効にしてない人がいたり、たまたまマージのタイミングでポインタになってないファイルがあるのが原因です。
> [Git LFS で次のエラーメッセージが出たときの一発対処法：Encountered 3 file(s) that should have been pointers, but weren't: - Qiita](https://qiita.com/kazuki-ma/items/782cd1cd7eca2fe988b7)

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

```bash
# 自分の設定を見てみると・・・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 - アトラシアン製品ドキュメント](https://ja.confluence.atlassian.com/bitbucketserver075/git-large-file-storage-1018785623.html)

```bash
# 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
```