1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

改行コード(LF/CRLF)完全ガイド:OS別の扱い方から Git トラブル解決まで

1
Posted at

株式会社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. ベストプラクティス

  1. プロジェクト開始時に .gitattributes で統一

    • チーム全体が同じ改行コードを使う約束を明文化
  2. 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
    
  3. エディタ設定を共有

    • .editorconfig または .vscode/settings.json をリポジトリに含める
  4. ローカルで自動変換を無効化

    git config --global core.autocrlf false
    git config --global core.safecrlf true
    
  5. ドキュメントに明記

    # 開発環境セットアップ
    
    ## 改行コード
    このプロジェクトは 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活用や開発効率化について発信しています。フォローお気軽にどうぞ!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?