株式会社Good Labでエンジニアをしている コータロー です。
日々、Java・SQL・Gitなどの技術情報や、新人エンジニア向けの学習ノウハウ、
AI活用についての情報を発信しています。
Good Labについて気になった方は、コーポレートサイトもぜひご覧ください。
▶コーポレートサイト
概要
改行コードの違いが原因で、Git の diff が大量発生したり、シェルスクリプトが実行できなくなったり、CI/CD が失敗したりすることは珍しくありません。本記事では、改行コードの仕組みと実務での対処法をまとめました。
1. 改行コードとは
テキストファイルの改行を表現するバイト列は、以下の3種類が存在します。
| 種類 | 記号 | バイト列 | 説明 |
|---|---|---|---|
| LF (Line Feed) | \n |
0x0A |
Unix/Linux/Mac(OS X以降) の標準 |
| CR (Carriage Return) | \r |
0x0D |
古い Mac (Classic Mac OS まで) で使用 |
| CRLF (CR + LF) | \r\n |
0x0D 0x0A |
Windows の標準 |
歴史的背景
- CR: タイプライターでキャリッジ(用紙送り機構)を行頭に戻す動作
- LF: 用紙を1行下に送る動作
- 古い OS ではこの2つを区別して実装する必要があったため、それぞれを個別に指定していました
2. OS別の標準
Windows → CRLF (\r\n)
Linux → LF (\n)
Mac → LF (\n)
ただし、Windows でも開発ツール(Git Bash、WSL 2、VS Code など)を使う場合は LF に統一する方が無難です。
3. 改行コードの確認方法
3.1 コマンドラインで確認
# hexdump で16進数表示
hexdump -C filename.txt
# od コマンド
od -c filename.txt
# cat -A で可視化(推奨)
cat -A filename.txt
例:
$ cat -A test.txt
hello^M$ # CRLF(^M は CR を表示)
world$ # LF
3.2 エディタで確認
-
VS Code: 右下ステータスバー に
CRLFまたはLFと表示 -
Sublime Text:
View → Line Endingsで確認 -
Vim:
:set fileformat?で確認
4. 実務トラブル事例
4.1 Git で全行が変更扱いになる
$ git diff
# ファイル全体が「-oldline\r\n +oldline」と表示される
原因: ローカルとリモートの改行コードが異なっている。
対処法:
# 現在のブランチで CRLF を LF に統一
git add -A
git commit --amend --no-edit
# または全リポジトリで統一(`.gitattributes` を使う)
echo "* text=auto" >> .gitattributes
git add .gitattributes
git commit -m "Normalize line endings"
4.2 シェルスクリプトが実行できない
$ ./deploy.sh
./deploy.sh: line 2: $'\r': command not found
原因: スクリプトが CRLF で保存されている。
対処法:
# CRLF を LF に変換
dos2unix deploy.sh # または sed -i 's/\r$//' deploy.sh
# または最初から LF で保存する設定
git config core.safecrlf true # 保護モード
4.3 Windows + Git でファイルが勝手に変換される
Git がファイルをチェックアウトする際に CRLF ↔ LF を自動変換する設定になっていることがあります。
確認方法:
git config core.autocrlf
# 出力: true (Windows)
# 出力: input (Mac/Linux)
推奨設定:
# チーム全体で LF に統一する場合
git config core.autocrlf false
echo "* text=auto eol=lf" > .gitattributes
git add .gitattributes
5. .gitattributes による統一管理(推奨)
プロジェクト内の改行コードを統一するには、.gitattributes を使うのが最も確実です。
# .gitattributes
# デフォルト:すべてのテキストファイルを LF で統一
* text=auto eol=lf
# バイナリファイルはチェックアウト時に変換しない
*.png binary
*.jpg binary
*.gif binary
*.zip binary
# 特定のファイル
*.sh text eol=lf
*.bat text eol=crlf
*.ps1 text eol=crlf
設定後の手順:
# 既存ファイルを正規化
git add --renormalize .
git commit -m "Normalize all files to LF"
# または(クリーンスレートの場合)
rm -rf .git/index
git reset
git add .
git commit -m "Normalize line endings"
6. 言語・フレームワーク別の注意点
6.1 Python
#!/usr/bin/env python3 # 最初の行は LF でないとシェバングが動作しない
6.2 Shell Script
#!/bin/bash
# 全行 LF であることが必須(CRLF だと実行時エラー)
6.3 Windows Batch / PowerShell
# .bat, .cmd ファイルは CRLF で保存するのが一般的
# ただし、Git 側で LF に統一している場合は .gitattributes で CRLF を明示
6.4 JSON / YAML / Markdown
言語仕様上は改行コードを区別しないため、チーム方針に従う(通常は LF)。
7. エディタ設定
VS Code(推奨)
// .vscode/settings.json
{
"files.eol": "\n",
"files.insertFinalNewline": true,
"files.trimFinalNewlines": true
}
Sublime Text
{
"default_line_ending": "unix"
}
Vim
" ~/.vimrc
set fileformat=unix
set fileformats=unix,dos,mac
8. ベストプラクティス
-
プロジェクト開始時に
.gitattributesで統一- チーム全体が同じ改行コードを使う約束を明文化
-
CI/CD で改行コードをチェック
# GitHub Actions の例 - name: Check line endings run: | if git grep --cached -l $'\r' ; then echo "CRLF found in tracked files" exit 1 fi -
エディタ設定を共有
-
.editorconfigまたは.vscode/settings.jsonをリポジトリに含める
-
-
ローカルで自動変換を無効化
git config --global core.autocrlf false git config --global core.safecrlf true -
ドキュメントに明記
# 開発環境セットアップ ## 改行コード このプロジェクトは LF を使用しています。 必ず以下の設定を行なってください: git config core.autocrlf false
9. トラブル対応フローチャート
改行コード関連のトラブルが発生
↓
[問題の種類]
├─ Git diff が大量 → 4.1 参照
├─ スクリプト実行エラー → 4.2 参照
├─ ファイルが勝手に変換 → 4.3 参照
└─ CI/CD 失敗 → .gitattributes 設定を確認
10. まとめ
| 項目 | 推奨値 |
|---|---|
| デフォルト改行コード | LF(\n) |
| 統一方法 |
.gitattributes + .editorconfig
|
| Git 設定 |
core.autocrlf = false / core.safecrlf = true
|
| 確認コマンド |
cat -A / VS Code ステータスバー |
| 自動変換ツール |
dos2unix / sed
|
改行コードは一度統一してしまえば、以降のトラブルはほぼ解消されます。プロジェクト初期段階で設定を整備することをお勧めします。
参考
@kotaro_ai_lab
AI活用や開発効率化について発信しています。フォローお気軽にどうぞ!