.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ではなく)を使う理由

ロックファイルは以下が必要です:

  1. text: 行末正規化がCRLF/LFマージコンフリクトを防止
  2. -diff: 数千行に及ぶdiffを抑制
  3. 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のノイズとレビューの疲労を即座に軽減します。

試してみる — .gitattributes Generator

フルツールを開く