Gitで改行コードが勝手に変わる!原因と完全対策ガイド

「Gitでファイルをコミットしたら、何も変更していないのに全行が変更扱いになってる…」「チェックアウトしたらシェルスクリプトが動かなくなった!」こんな経験はありませんか?

これは、Gitの改行コード自動変換機能が原因で起こる典型的なトラブルです。Windows(CRLF)とLinux/Mac(LF)の間で開発していると、知らないうちにファイルの改行コードが変換されてしまい、思わぬ問題を引き起こします。

この記事では、Gitの改行コード問題の仕組みを徹底解説し、OS別の推奨設定から.gitattributesを使った確実な対策方法まで、すべてをカバーします。

スポンサーリンク
  1. 改行コードとは?LF・CRLF・CRの違い
    1. 3種類の改行コード
    2. なぜOSによって改行コードが違うのか?
  2. Gitで改行コードが勝手に変わる理由
    1. core.autocrlfの仕組み
    2. core.autocrlfの3つの設定値
    3. Git for Windowsのデフォルト設定
  3. 改行コード問題が引き起こす具体的なトラブル
    1. トラブル1:シェルスクリプトが動かない
    2. トラブル2:全行が変更扱いになる
    3. トラブル3:diffに謎の^Mが表示される
    4. トラブル4:Dockerコンテナが起動しない
  4. 現在の設定を確認する方法
    1. core.autocrlfの設定を確認
    2. ファイルの改行コードを確認
    3. エディタで確認
  5. OS別の推奨設定
    1. 基本方針:リポジトリは常にLFで統一
    2. Windows での推奨設定
    3. Linux / Mac での推奨設定
    4. 設定の実例
  6. .gitattributes による確実な改行コード管理
    1. .gitattributesの基本
    2. 改行コード制御の属性
    3. 推奨 .gitattributes テンプレート
    4. .gitattributesの配置と適用
  7. 既存リポジトリの改行コードを修正する
    1. 手順1:現状確認
    2. 手順2:core.autocrlfをfalseに設定
    3. 手順3:.gitattributesを作成
    4. 手順4:全ファイルを再正規化
    5. 手順5:変更をコミット
    6. 手順6:チームメンバーに通知
    7. 手順7:確認
  8. トラブルシューティング
    1. 問題1:「warning: LF will be replaced by CRLF」
    2. 問題2:「warning: CRLF will be replaced by LF」
    3. 問題3:シェルスクリプトが「bad interpreter」エラー
    4. 問題4:全行が変更扱いになる
    5. 問題5:.gitattributesが効かない
    6. 問題6:Dockerコンテナでスクリプトが実行できない
  9. よくある質問(FAQ)
    1. Q1:core.autocrlfはtrueとfalse、どちらにすべきですか?
    2. Q2:.gitattributesとcore.autocrlf、どちらが優先されますか?
    3. Q3:既存のcommit履歴の改行コードも変更されますか?
    4. Q4:バイナリファイルも自動変換されますか?
    5. Q5:Gitのバージョンによって動作が違いますか?
    6. Q6:MacとWindowsが混在するチームの推奨設定は?
    7. Q7:.gitattributesはどこに置けばいいですか?
    8. Q8:改行コードの混在をコミット前にチェックできますか?
    9. Q9:GitHub ActionsやCIでも設定が必要ですか?
    10. Q10:Windows専用プロジェクトでもLFにすべきですか?
  10. まとめ:改行コード問題を完全に解決する

改行コードとは?LF・CRLF・CRの違い

まず基本から。改行コードとは、テキストファイルで「改行」を表現するための制御文字です。実は、OSによって使用する改行コードが異なります。

3種類の改行コード

改行コード正式名称制御文字使用OS記号表示
LFLine Feed(ラインフィード)\nLinux、Mac(macOS)、Unix
CRLFCarriage Return + Line Feed\r\nWindows
CRCarriage Return(キャリッジリターン)\r旧Mac OS(9以前)

簡単に言うと:

  • LF:「次の行に移動」(↓だけ)
  • CRLF:「行頭に戻って次の行に移動」(←と↓の組み合わせ)
  • CR:「行頭に戻る」(←だけ)※現在はほぼ使われない

なぜOSによって改行コードが違うのか?

これは歴史的な経緯があります。

タイプライター時代の名残:

  • CR(Carriage Return):タイプライターの印字ヘッドを左端に戻す動作
  • LF(Line Feed):紙を1行分上に送る動作
  • 物理的に2つの動作が必要だった

コンピュータでの採用:

  • Unix/Linux:効率重視でLFのみを採用
  • Windows(MS-DOS):タイプライターの動作を忠実に再現してCRLF
  • 旧Mac OS:独自路線でCRのみ(現在のmacOSはLF)

この違いが、現代のクロスプラットフォーム開発で問題を引き起こしているのです。

Gitで改行コードが勝手に変わる理由

Gitには、この改行コードの違いを「自動的に吸収してくれる」機能があります。それがcore.autocrlf設定です。

core.autocrlfの仕組み

Gitは、コミット時とチェックアウト時に改行コードを自動変換します。

動作イメージ:

【Windowsユーザー】
ローカル(作業ディレクトリ) ←→ リポジトリ
    CRLF ファイル           ←→    LF ファイル
         ↑ チェックアウト時          ↑ コミット時
         | LF → CRLF 変換           | CRLF → LF 変換

core.autocrlfの3つの設定値

設定値コミット時チェックアウト時推奨OS
trueCRLF → LFLF → CRLFWindows
inputCRLF → LF変換しないLinux、Mac
false変換しない変換しない

具体的な動作:

core.autocrlf = true(Windows推奨)

コミット時:
  ローカル CRLF ファイル → リポジトリ LF ファイル

チェックアウト時:
  リポジトリ LF ファイル → ローカル CRLF ファイル
  • 利点:Windowsアプリが正常に動作(メモ帳等がCRLF前提)
  • 欠点:全員が同じ設定でないと混乱する

core.autocrlf = input(Linux/Mac推奨)

コミット時:
  ローカル CRLF ファイル → リポジトリ LF ファイル

チェックアウト時:
  リポジトリ LF ファイル → ローカル LF ファイル(そのまま)
  • 利点:誤ってCRLFがコミットされても自動修正
  • 欠点:Windows特有ファイル(.batなど)で問題が起きる可能性

core.autocrlf = false(非推奨)

コミット時:変換なし
チェックアウト時:変換なし
  • 利点:Gitが余計なことをしない(シンプル)
  • 欠点:チーム内でOSが混在すると改行コード混在の温床に

Git for Windowsのデフォルト設定

重要: Git for Windowsをインストールすると、デフォルトでcore.autocrlf = trueになります。

インストール時の選択画面:

Configuring the line ending conversions

○ Checkout Windows-style, commit Unix-style line endings
  (推奨) core.autocrlf = true

○ Checkout as-is, commit Unix-style line endings
  core.autocrlf = input

○ Checkout as-is, commit as-is
  core.autocrlf = false

多くの人は何も考えずに推奨設定でインストールしてしまい、後で問題に遭遇します。

改行コード問題が引き起こす具体的なトラブル

トラブル1:シェルスクリプトが動かない

症状:

$ bash deploy.sh
bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directory

原因:

  • シェルスクリプトがCRLFでチェックアウトされた
  • Linuxは行末の^M(CR)を誤認識してコマンドが見つからない

影響:

  • Linuxサーバーでのデプロイ失敗
  • Dockerコンテナ内での実行エラー
  • 夜間バッチ処理の停止 → 本番障害

トラブル2:全行が変更扱いになる

症状:

$ git diff README.md
- 全ての行が削除(赤)
+ 全ての行が追加(緑)
  実際の内容は何も変わっていない

原因:

  • リポジトリはLFで管理
  • core.autocrlf = falseの環境でCRLFファイルをコミット
  • 改行コード以外は同じなのに「全行変更」と判定

影響:

  • コードレビューが不可能
  • マージコンフリクトが大量発生
  • git blameが使えない

トラブル3:diffに謎の^Mが表示される

症状:

$ git diff
-Hello World
+Hello World^M

原因:

  • リポジトリにCRLFが混入している
  • Gitが「CRLFとLFのファイルが違う」と判定

影響:

  • 差分が見にくい
  • 実際の変更箇所が分からない

トラブル4:Dockerコンテナが起動しない

症状:

$ docker-compose up
ERROR: Service 'app' failed to start: 
exec /app/entrypoint.sh: no such file or directory

原因:

  • entrypoint.shがCRLFでチェックアウトされた
  • Linux環境のDockerコンテナ内で実行できない

影響:

  • 開発環境が構築できない
  • CIが失敗する

現在の設定を確認する方法

トラブルシューティングの第一歩は、現状把握です。

core.autocrlfの設定を確認

グローバル設定を確認:

git config --global core.autocrlf

出力例:

true    # Windowsデフォルト(自動変換ON)
input   # Linux/Macで推奨
false   # 自動変換OFF
(何も表示されない)# 設定されていない(falseと同じ扱い)

リポジトリ固有の設定を確認:

git config --local core.autocrlf

設定の優先順位を確認:

git config --show-origin core.autocrlf

出力例:

file:C:/Users/username/.gitconfig    true

これで、設定がどこで定義されているかが分かります。

ファイルの改行コードを確認

方法1:git ls-files --eolコマンド(Git 2.10以降)

git ls-files --eol

出力例:

i/lf    w/crlf  attr/text=auto  README.md
i/lf    w/lf    attr/text=auto  deploy.sh
i/crlf  w/crlf  attr/           data.csv

読み方:

  • i/lf:インデックス(リポジトリ)内はLF
  • w/crlf:作業ディレクトリ(ワーキングツリー)内はCRLF
  • attr/text=auto.gitattributesの設定

方法2:fileコマンド(Linux/Mac)

file deploy.sh

出力例:

deploy.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators

方法3:dos2unix -iコマンド

dos2unix -i *.sh

出力例:

    123  0  deploy.sh  # 123行がDOS形式(CRLF)
      0  89  setup.sh   # 89行がUnix形式(LF)

方法4:リポジトリ内でCRLFを検索

git grep --cached -I $'\r'

CRLFが含まれるファイルが表示されます。何も表示されなければ、リポジトリは正常(LFのみ)です。

エディタで確認

Visual Studio Code:

画面右下のステータスバー:
「LF」または「CRLF」と表示される

Vim:

:set fileformat?

出力:

fileformat=unix  (LF)
fileformat=dos   (CRLF)
fileformat=mac   (CR)

OS別の推奨設定

チーム開発では、全員が統一した方針で設定することが重要です。

基本方針:リポジトリは常にLFで統一

推奨アプローチ:

  1. リポジトリ内:常にLF(改行コード混在を防ぐ)
  2. ローカル環境:OSに応じて調整(Windows = CRLF、Linux/Mac = LF)
  3. 強制力.gitattributesで制御(後述)

Windows での推奨設定

パターンA:自動変換ON(初心者向け)

git config --global core.autocrlf true

メリット:

  • Windowsアプリ(メモ帳、Excel等)でファイルが正しく表示される
  • リポジトリは自動的にLFで統一される

デメリット:

  • バイナリファイルが破損するリスク(稀)
  • Dockerやシェルスクリプトで問題が起きやすい

推奨する人:

  • Gitを初めて使うWindowsユーザー
  • Windows専用のプロジェクト(.NET Frameworkアプリ等)

パターンB:自動変換OFF + .gitattributes(推奨)

git config --global core.autocrlf false

その上で、プロジェクトルートに.gitattributesを配置(後述)。

メリット:

  • ファイル種別ごとに改行コードを制御できる
  • チーム全体で統一しやすい
  • バイナリファイルの破損リスクなし

デメリット:

  • .gitattributesの理解が必要
  • 既存プロジェクトへの適用には手間がかかる

推奨する人:

  • チーム開発をしているすべての人
  • Docker、Linux環境を使うプロジェクト

Linux / Mac での推奨設定

git config --global core.autocrlf input

動作:

  • コミット時:CRLFが混入していたらLFに変換(防御)
  • チェックアウト時:変換しない(LFのまま)

理由:

  • 通常、Linux/Macでは全てLFなので変換不要
  • 万が一CRLFファイルが混入してもコミット時に自動修正
  • シェルスクリプト等が確実にLFで動作

設定の実例

Windows開発者の理想的な設定:

# グローバル設定は無効化
git config --global core.autocrlf false

# プロジェクトごとに .gitattributes で制御
# (後述の .gitattributes セクションを参照)

Linux/Mac開発者の理想的な設定:

# CRLFの混入を防ぐ
git config --global core.autocrlf input

.gitattributes による確実な改行コード管理

.gitattributesは、リポジトリに含めることで全員に同じルールを強制できる最も確実な方法です。

.gitattributesの基本

.gitattributesファイルをプロジェクトルートに配置すると、core.autocrlfの設定を上書きします。

基本構文:

ファイルパターン  属性

改行コード制御の属性

属性意味動作
textテキストファイル常にLFで管理(コミット時にCRLF→LF)
text=auto自動判別Gitがテキストかバイナリか判定
text eol=lfLF強制チェックアウト時も常にLF
text eol=crlfCRLF強制チェックアウト時は常にCRLF
binaryバイナリ変換しない(-text -diffのエイリアス)
-textテキストとして扱わない変換しない

推奨 .gitattributes テンプレート

基本版(シンプル):

# デフォルトはGitに判定させる
* text=auto

# シェルスクリプトは必ずLF
*.sh text eol=lf
*.bash text eol=lf

# Windowsバッチファイルは必ずCRLF
*.bat text eol=crlf
*.cmd text eol=crlf
*.ps1 text eol=crlf

# バイナリファイル
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.pdf binary
*.zip binary
*.tar.gz binary

詳細版(完全):

##############################################################
# 改行コード管理設定
# リポジトリは常にLF、チェックアウト時に必要に応じて変換
##############################################################

# デフォルト:Gitに自動判定させる
* text=auto

#
# テキストファイル(LF強制)
#

# ソースコード
*.c text eol=lf
*.cpp text eol=lf
*.h text eol=lf
*.java text eol=lf
*.py text eol=lf
*.rb text eol=lf
*.go text eol=lf
*.rs text eol=lf

# Web関連
*.js text eol=lf
*.ts text eol=lf
*.jsx text eol=lf
*.tsx text eol=lf
*.html text eol=lf
*.css text eol=lf
*.scss text eol=lf
*.sass text eol=lf
*.vue text eol=lf

# マークアップ・設定ファイル
*.md text eol=lf
*.txt text eol=lf
*.json text eol=lf
*.xml text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
*.toml text eol=lf

# シェルスクリプト(必ずLF)
*.sh text eol=lf
*.bash text eol=lf

# Dockerfile
Dockerfile text eol=lf
*.dockerfile text eol=lf

# Makefile
Makefile text eol=lf
*.mk text eol=lf

# Git関連
.gitattributes text eol=lf
.gitignore text eol=lf
.gitconfig text eol=lf

#
# Windows専用ファイル(CRLF強制)
#

# バッチファイル
*.bat text eol=crlf
*.cmd text eol=crlf

# PowerShellスクリプト
*.ps1 text eol=crlf
*.psm1 text eol=crlf
*.psd1 text eol=crlf

# Visual Studioプロジェクト
*.sln text eol=crlf
*.csproj text eol=crlf
*.vbproj text eol=crlf

#
# バイナリファイル(変換しない)
#

# 画像
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.bmp binary
*.svg binary
*.webp binary

# フォント
*.ttf binary
*.otf binary
*.woff binary
*.woff2 binary
*.eot binary

# 圧縮ファイル
*.zip binary
*.tar binary
*.gz binary
*.bz2 binary
*.7z binary
*.rar binary

# オフィス文書
*.pdf binary
*.doc binary
*.docx binary
*.xls binary
*.xlsx binary
*.ppt binary
*.pptx binary

# 実行ファイル
*.exe binary
*.dll binary
*.so binary
*.dylib binary
*.app binary

# データベース
*.db binary
*.sqlite binary
*.sqlite3 binary

# その他
*.jar binary
*.war binary
*.ear binary
*.class binary
*.pyc binary

.gitattributesの配置と適用

ステップ1:ファイルを作成

cd /path/to/your/repository

# エディタで作成
vi .gitattributes

ステップ2:コミット

git add .gitattributes
git commit -m "Add .gitattributes for line ending normalization"

ステップ3:既存ファイルを正規化(重要!)

.gitattributesを追加しただけでは、既存ファイルには適用されません。

# 方法1:全ファイルを再正規化(Git 2.16以降)
git add --renormalize .

# 方法2:強制的に再チェックアウト(古いGit)
git rm --cached -r .
git reset --hard

ステップ4:コミット

git commit -m "Normalize line endings"

警告:
この操作は、多数のファイルが変更扱いになる可能性があります。チーム全体に事前通知してから実行しましょう。

既存リポジトリの改行コードを修正する

すでに改行コードが混在しているリポジトリを直す手順です。

手順1:現状確認

# リポジトリ内のCRLFを検索
git grep --cached -I $'\r'

大量にヒットする場合は、リポジトリにCRLFが混入しています。

手順2:core.autocrlfをfalseに設定

# グローバル設定を確認
git config --global core.autocrlf

# falseでなければ変更
git config --global core.autocrlf false

# リポジトリ固有設定も確認
cd /path/to/repository
git config core.autocrlf false

手順3:.gitattributesを作成

# プロジェクトルートで
cat > .gitattributes <<'EOF'
* text=auto eol=lf

# Windows専用ファイル
*.bat text eol=crlf
*.cmd text eol=crlf
*.ps1 text eol=crlf

# バイナリ
*.png binary
*.jpg binary
*.pdf binary
EOF

git add .gitattributes
git commit -m "Add .gitattributes"

手順4:全ファイルを再正規化

# ステージングエリアをクリア
git rm --cached -r .

# すべてのファイルを再度追加(.gitattributesに従って変換される)
git add .

# 何が変わったか確認
git status

大量のファイルが変更扱いになるはずです。

手順5:変更をコミット

git commit -m "Normalize line endings to LF"

手順6:チームメンバーに通知

他のメンバーがすべきこと:

# 最新をpull
git pull

# 作業中の変更を一時退避
git stash

# ローカルファイルをクリーンアップ
git rm --cached -r .
git reset --hard

# 退避した変更を戻す
git stash pop

手順7:確認

# 改行コードを確認
git ls-files --eol

# CRLFが残っていないか確認
git grep --cached -I $'\r'

何も出力されなければ成功です!

トラブルシューティング

問題1:「warning: LF will be replaced by CRLF」

症状:

$ git add file.txt
warning: LF will be replaced by CRLF in file.txt.
The file will have its original line endings in your working directory

原因:

  • core.autocrlf = true(Windowsデフォルト)
  • ファイルはLFだが、チェックアウト時にCRLFに変換される予定

対処法:

即効性:警告を無視する

# 警告は無害(単なる通知)
# そのままコミット可能
git commit -m "Update file"

根本的解決:設定を変更

# パターンA:自動変換を無効化
git config --global core.autocrlf false

# パターンB:.gitattributesで制御
echo "* text=auto eol=lf" > .gitattributes
git add .gitattributes
git commit -m "Add .gitattributes"

問題2:「warning: CRLF will be replaced by LF」

症状:

$ git add file.txt
warning: CRLF will be replaced by LF in file.txt.

原因:

  • core.autocrlf = inputまたはtrue
  • ファイルにCRLFが含まれており、コミット時にLFに変換される

対処法:

意図的にCRLFを保持したい場合:

# .gitattributes でCRLF強制
echo "file.txt text eol=crlf" >> .gitattributes
git add .gitattributes
git add file.txt

LFに統一したい場合:

# そのままコミット(自動的にLFになる)
git commit -m "Update file"

問題3:シェルスクリプトが「bad interpreter」エラー

症状:

$ ./deploy.sh
bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directory

原因:

  • スクリプトがCRLFでチェックアウトされた
  • Linuxは\r\nを認識できない

即座の対処:

# dos2unix で変換
dos2unix deploy.sh

# または sed で変換
sed -i 's/\r$//' deploy.sh

# または tr で削除
tr -d '\r' < deploy.sh > deploy_fixed.sh
mv deploy_fixed.sh deploy.sh

根本的解決:

# .gitattributes でLF強制
echo "*.sh text eol=lf" >> .gitattributes
git add .gitattributes

# スクリプトを再チェックアウト
git rm --cached deploy.sh
git checkout deploy.sh

# コミット
git commit -m "Fix shell script line endings"

問題4:全行が変更扱いになる

症状:

$ git diff
-すべての行が削除
+すべての行が追加

原因:

  • 改行コードだけが変わった
  • Gitは「全行変更」と判定

確認方法:

# 改行コード変更を無視してdiff
git diff --ignore-cr-at-eol

# または
git diff --ignore-all-space

修正方法:

# 改行コードを統一
# (前述の「既存リポジトリの修正」セクションを参照)

問題5:.gitattributesが効かない

症状:

  • .gitattributesを追加したのに変換されない

原因:

  • 既存ファイルには適用されない

解決方法:

# 強制的に再正規化
git add --renormalize .
git commit -m "Apply .gitattributes"

# または
git rm --cached -r .
git reset --hard

問題6:Dockerコンテナでスクリプトが実行できない

症状:

exec /app/entrypoint.sh: no such file or directory

原因:

  • entrypoint.shがCRLFになっている

解決方法:

Dockerfile内で強制的にLF変換:

FROM ubuntu:22.04

COPY entrypoint.sh /app/

# LFに強制変換
RUN sed -i 's/\r$//' /app/entrypoint.sh && \
    chmod +x /app/entrypoint.sh

ENTRYPOINT ["/app/entrypoint.sh"]

または、.gitattributesで防止:

*.sh text eol=lf
Dockerfile text eol=lf

よくある質問(FAQ)

Q1:core.autocrlfはtrueとfalse、どちらにすべきですか?

A: チーム全体で.gitattributesを使うならfalseを推奨します。

理由:

  • .gitattributesがより強力で柔軟
  • リポジトリに含めるので全員に強制できる
  • ファイルごとに改行コードを制御可能

ただし:

  • 1人で開発しているWindowsユーザーならtrueでもOK
  • Linux/Macユーザーはinputが無難

Q2:.gitattributesとcore.autocrlf、どちらが優先されますか?

A: .gitattributesが優先されます。

優先順位:

1. .gitattributes(最優先)
2. core.autocrlf
3. デフォルト動作

チーム開発では.gitattributesを使うべき理由です。

Q3:既存のcommit履歴の改行コードも変更されますか?

A: いいえ、過去のコミットは変更されません。

.gitattributesや設定変更は、新しいコミットにのみ影響します。

もし過去のコミットを修正したい場合は、git filter-repoなどの高度なツールが必要ですが、推奨しません(履歴が書き換わるため)。

Q4:バイナリファイルも自動変換されますか?

A: 基本的にされませんが、念のため明示すべきです。

Gitは一応バイナリ判定をしますが、完璧ではありません。

推奨:

*.png binary
*.jpg binary
*.pdf binary
*.exe binary

Q5:Gitのバージョンによって動作が違いますか?

A: 基本的な動作は同じですが、一部コマンドが異なります。

主な違い:

  • Git 2.16以降git add --renormalizeが使える
  • Git 2.10以降git ls-files --eolが使える
  • 古いGit:上記コマンドが使えない(別の方法が必要)

古いGitを使っている場合は、アップデートを検討してください。

Q6:MacとWindowsが混在するチームの推奨設定は?

A: 全員が以下の設定にすることを推奨します。

Windowsユーザー:

git config --global core.autocrlf false

Mac/Linuxユーザー:

git config --global core.autocrlf input

全員共通:
プロジェクトルートに.gitattributesを配置:

* text=auto eol=lf

# Windows専用ファイルのみCRLF
*.bat text eol=crlf
*.cmd text eol=crlf
*.ps1 text eol=crlf

# バイナリ
*.png binary
*.jpg binary

Q7:.gitattributesはどこに置けばいいですか?

A: プロジェクトのルートディレクトリに置きます。

your-project/
├── .git/
├── .gitattributes  ← ここ
├── .gitignore
├── README.md
└── src/

サブディレクトリに配置することも可能ですが、通常はルートに1つだけで十分です。

Q8:改行コードの混在をコミット前にチェックできますか?

A: はい、core.safecrlfを有効にすると警告してくれます。

# 警告のみ表示(コミットは継続)
git config --global core.safecrlf warn

# エラーでコミットを拒否
git config --global core.safecrlf true

動作:

  • true:改行コードが混在している場合、コミットを拒否
  • warn:警告を表示するがコミットは実行
  • false:何もチェックしない(デフォルト)

Q9:GitHub ActionsやCIでも設定が必要ですか?

A: .gitattributesがあれば不要です。

CI環境でも.gitattributesの設定が適用されます。ただし、念のため確認コマンドを追加することを推奨:

# GitHub Actions の例
name: Check Line Endings

on: [push, pull_request]

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Check for CRLF
        run: |
          if git grep --cached -I $'\r' ; then
            echo "❌ CRLF found in repository!"
            exit 1
          else
            echo "✅ All files use LF"
          fi

Q10:Windows専用プロジェクトでもLFにすべきですか?

A: 場合によります。

LFを推奨するケース:

  • Docker、Linux環境を使う可能性がある
  • オープンソースプロジェクト
  • 将来的にクロスプラットフォーム化する可能性

CRLFでもOKなケース:

  • 完全にWindows専用(.NET Framework等)
  • 外部公開しない社内ツール
  • レガシーシステムの保守

その場合の設定:

* text=auto eol=crlf

ただし、一般的にはLF統一を推奨します。将来の拡張性が高いためです。

まとめ:改行コード問題を完全に解決する

Gitの改行コード自動変換は、便利なようで罠が多い機能です。特にチーム開発では、メンバー間で設定が異なると混乱の元になります。

推奨アプローチ:

  1. 個人設定を統一
  • Windows:git config --global core.autocrlf false
  • Mac/Linux:git config --global core.autocrlf input
  1. プロジェクトに.gitattributesを追加
   * text=auto eol=lf

   *.bat text eol=crlf
   *.cmd text eol=crlf
   *.ps1 text eol=crlf

   *.png binary
   *.jpg binary
  1. 既存リポジトリを正規化
   git add --renormalize .
   git commit -m "Normalize line endings"
  1. チーム全体で方針を共有
  • READMEに記載
  • オンボーディング時に説明
  • プルリクエストでレビュー

最重要ポイント:

  • リポジトリは常にLFで統一
  • .gitattributesで制御する(個人設定に依存しない)
  • バイナリファイルは明示する
  • チーム全体で統一した設定を使う
  • core.autocrlf = true依存しない

この記事の手順に従えば、改行コード問題から完全に解放されます。快適なGitライフを!


参考リンク:

コメント

タイトルとURLをコピーしました