■0からLFS管理完了まで
<ローカルリポジトリ作成からLFSの機能を使用できるようにするまで>
・Git LFSをインストール
git lfs install
・ローカルリポジトリ作成(git initまで)
<LFSの対象ファイルの保管先を外部サーバーの特定ディレクトリ配下に指定>
※LFSデータの保管先ディレクトリ名がGitLfsTestShareの場合
・bare repositoryを作成
※UNCパスで指定する
※注意:ここでパスが通らない一因として、ディレクトリの共有設定の見直しも視野に入れて確認すること
※project-name-lfs.gitは通常、そのリポジトリのプロジェクト名を命名する
git init --bare //192.168.xx.x/GitLfsTestShare/project-name-lfs.git
正常にbare repositoryが作成されると↓のようにメッセージが出てくる
Initialized empty Git repository in //192.168.xx.x/GitLfsTestShare/project-name-lfs.git/
外部サーバーの任意のディレクトリにproject-name-lfs.gitが作られ、その中に下記のフォルダやファイルが格納された状態が確認できるようになる。
▽初期値
config
description
HEAD
hooks
info
objects
refs
▽実際にLFSデータがpushされた場合
config
description
HEAD
hooks
info
lfs (この配下にあるobjectsフォルダ内にLFSの対象データが格納されていきます)
objects
refs
・bare repositoryをLFSの保存先を指定
git config -f .lfsconfig lfs.url "ここに必要な外部サーバーへのパス"
ex)
git config -f .lfsconfig lfs.url "file:////192.168.xx.x/GitLfsTestShare/project-name-lfs.git"
※ローカルリポジトリに.lfsconfigが作られる
・指定したディレクトリがLFSの格納先として設定されているか再確認
※外部サーバーの任意のディレクトリを格納先とするため、GitHub内のディレクトリが指定されているようなら、この指定を再設定する必要がある
(設定ファイルの記述の確認)
cat .lfsconfig
[下記のように表示されればok]
$ cat .lfsconfig
[lfs]
url = file:////192.168.xx.x/GitLfsTestShare/project-name-lfs.git
(実際にGit LFSが採用している設定確認)
git lfs env
[下記のように表示されればok]
※複数行表示される上側1行を抜粋
Endpoint=file:////192.168.xx.x/GitLfsTestShare/project-name-lfs
<LFS管理するファイルの種類やディレクトリを指定する>
・LFS管理するファイル種別を指定する
※この作業で.gitattributesが作られる
ex)assetsディレクトリ配下の階層問わず、pdf、mp4、mov、psdファイルを対象とする場合
git lfs track "assets/*.pdf"
git lfs track "assets/**/*.pdf"
git lfs track "assets/*.mp4"
git lfs track "assets/**/*.mp4"
git lfs track "assets/*.mov"
git lfs track "assets/**/*.mov"
git lfs track "assets/*.psd"
git lfs track "assets/**/*.psd"
・設定されているか確認
※対象となっているファイル拡張子がパス含めて表示される
git lfs track
または
cat .gitattributes
・特定ファイルがLFS対象判定か確認する
git check-attr filter diff merge text -- assets/**
filter: lfsと出ているとLFS対象となっている
filter: unspecified
※↓の指定の方が全体的に確認がしやすい
$ git check-attr filter diff merge text -- hoge/**/*
・対象ファイルをgit addし、ポインタ登録する
・ポインタとして登録されているか確認
※登録されていないとfatal: Not a valid object name ~ と表示される
git cat-file -p :(ファイル迄のパス)
ex) git cat-file -p :assets/video/hogehoge.mp4
※登録されていると、下記のように表示される
version https://git-lfs.github.com/spec/v1
oid sha256:(ここにハッシュ値が表示される)
size (ここに容量が表示される)
・addしたファイルをcommit
※ここはこれまでの作業タイミングによりますが、
対象がローカルリポジトリ内全てであればgit add .でもいいし、特定ファイルに絞りたい場合は、対象ファイルのみaddします。
<リモートリポジトリを作成し、ローカルリポジトリの内容をpushする>
・自身のgithubアカウントにてリモートリポジトリを作成後、ローカルリポジトリと紐づけ
git remote add origin https://github.com/GitHubUserName/GitHubRemoteRepository.git
・コミットメッセージを入力し、push
git commit -m "first commit"
git push -u origin main
[実行後のCUIの表示]
※最初の「Uploading LFS objects」の行が表示されてから、少し間があきますがしばらく待っていると進行していきます。
Uploading LFS objects: 100% (1/1), 0 B | 0 B/s, done.
Enumerating objects: xx、done.
Counting objects: 100% (xx/xx), done.
Delta compression using up to x threads
Compressing objects: 100% (x/x), done.
Writing objects: 100% (x/x), xx.xx MiB | xx.xx MiB/s, done.
Total xx (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com//GitHubUserName/GitHubRemoteRepository.git
* [new branch] main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
※ここまででリモートリポジトリへのpushに加え、LFSのディレクトリへの実データの格納までが完了したことになる。
■補足
<LFSの設定を再確認した方が良い場合>
・リモートURLを変更した
・.lfsconfigを変更した
・新しいPCでcloneした
・LFS保管先を変えた
・GitHubへLFSが送られていないか不安なとき
・clone先でLFSファイル復元に失敗したとき
■pre-commit hookの活用があるとさらに厳格化できる
- pre-commit hookでLFS対象漏れを検知
- --no-verifyは禁止と明文化
- hookが止めた場合の対応手順も明文化
- 初回セットアップ手順にhook導入を含める
▽READMEファイルに記載しておくとよい内容
--no-verify の使用は禁止です。
pre-commit hookは、LFS対象ファイルの通常Git混入を防ぐための必須チェックです。
hookでエラーが出た場合は、表示された対象ファイルを確認し、LFS対象設定を行ったうえで再度commitしてください。
やむを得ず --no-verify が必要な場合は、事前に管理者へ確認してください。
■参考
既存のcommit履歴から対象ファイルをピックアップし、LFSディレクトリに保存する
https://zenn.dev/medicalforce/articles/2daf62952100a1
pre-commitやpre-pushの概要
https://kinsta.com/jp/blog/git-hooks/