.gitattributesでのロックファイルの処理
パッケージマネージャーのロックファイル(package-lock.json、yarn.lock、Cargo.lock)をdiff抑制付きで.gitattributesで処理するためのベストプラクティス。
Best Practices
詳細な説明
ロックファイルの処理
パッケージマネージャーのロックファイルは、ノイズの多いdiffとマージコンフリクトの最も一般的な原因の1つです。これらは追跡してマージする必要があるテキストファイルですが、そのdiffはコードレビューにとってほとんど有用ではありません。
推奨設定
# JavaScript / Node.js
package-lock.json text -diff
yarn.lock text -diff
pnpm-lock.yaml text -diff
# Rust
Cargo.lock text -diff
# Python
poetry.lock text -diff
Pipfile.lock text -diff
pdm.lock text -diff
uv.lock text -diff
# Ruby
Gemfile.lock text -diff
# PHP
composer.lock text -diff
# .NET
packages.lock.json text -diff
# Go(モジュールチェックサム)
go.sum text -diff
# Dart / Flutter
pubspec.lock text -diff
# Elixir
mix.lock text -diff
text -diff(binaryではなく)を使う理由
ロックファイルは以下が必要です:
text: 行末正規化がCRLF/LFマージコンフリクトを防止-diff: 数千行に及ぶdiffを抑制binaryではない: 3ウェイマージ機能が必要
ロックファイルをbinaryとしてマークすると、Gitは同時変更をマージできず、すべてのロックファイル更新がマージコンフリクトになります。
ロックファイルのマージ戦略
一部のチームは、常に現在のバージョンを受け入れて再生成するカスタムマージドライバーをロックファイルに設定します:
# .gitconfigで
[merge "npm-merge"]
name = npm merge lock file
driver = npx npm-merge-driver merge %A %O %B %P
# .gitattributesで
package-lock.json merge=npm-merge
ロックファイルはコミットすべき?
| ファイル | コミット? | 理由 |
|---|---|---|
package-lock.json |
はい(アプリ) | 再現可能なビルド |
yarn.lock |
はい(アプリ) | 再現可能なビルド |
Cargo.lock |
はい(バイナリ)、いいえ(ライブラリ) | Rustの慣例 |
poetry.lock |
はい(アプリ) | 再現可能なインストール |
go.sum |
はい | セキュリティ検証 |
ライブラリは通常、消費者が独自の依存関係ツリーを解決すべきであるため、ロックファイルをコミットしません。
ユースケース
ロックファイルを持つパッケージマネージャーを使用するすべてのプロジェクトは、そのファイルに`text -diff`を設定する必要があります。これは、Gitワークフローに対して行える最も影響が大きく、最も手間のかからない改善の1つであり、PRのノイズとレビューの疲労を即座に軽減します。