2025-07-29 @obikosato
GitHub上のプルリクとかで見かけるやつ
末尾に改行がない↓
末尾に改行がある↓
POSIXでは「行=改行で終わる」と定義されています。
UNIX系ツールの多くがこれに基づいており、「行は改行で終わる」ことを前提に動作します。 末尾に改行がないと、意図しない挙動を引き起こすことがあります。
wc -l
$ cat a.csv aaa,bbb ccc,ddd%
$ wc -l a.csv 1
本来は2行のはずが、1行としてカウントされる。
cat
$ cat a.csv a.csv aaa,bbb ccc,dddaaa,bbb ccc,ddd%
末尾に改行がないため、2つ目のファイルの内容が1行目にくっついてしまう。
Vimはデフォルトで自動で末尾に改行を入れてくれるけど、 VSCodeはデフォルトでは末尾に改行を入れてくれない。
Claude CodeなどのAIツールも指示しないと末尾に改行を入れてくれないことがある。
{ "files.insertFinalNewline": true, // ファイルの末尾に改行を入れる "files.trimFinalNewlines": true // ファイルの末尾の改行が複数あったら1つにまとめる }
[*] insert_final_newline = true # ファイルの末尾に改行を入れる
AI(Claude Codeなど)は末尾改行が苦手なようなので、明示的に指示しましょう。 お手元のAIにもよろしくお伝えください。
.editorconfigのルールに合っていない場合は失敗(エラー)として検知されます。
name: EditorConfig Checker on: pull_request: branches: - main jobs: editorconfig: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v4 - uses: editorconfig-checker/action-editorconfig-checker@main - run: editorconfig-checker
EditorConfig + GitHub Actions + ブランチ保護ルールの 具体的な設定手順をこちらにまとめました。
https://github.com/obikosato/ci-sample/blob/main/protect-main-with-editorconfig.md
これにより、末尾改行のないファイルはmainブランチにマージできなくなります。
適当なリポジトリのルートで実行してみましょう。(UNIX互換シェル環境で)
git ls-files -z | while IFS= read -r -d '' file; do file --mime "${file}" | grep -q -e "charset=binary" -e "image/svg+xml" || tail -c1 "${file}" | read -r _ || echo "Missing newline: ${file}" done
3.387 Text File A file that contains characters organized into zero or more lines. The lines do not contain NUL characters and none can exceed {LINE_MAX} bytes in length, including the <newline> character. ... 3.185 Line A sequence of zero or more non-<newline> characters plus a terminating <newline> character.
A file that contains characters organized into zero or more lines. The lines do not contain NUL characters and none can exceed {LINE_MAX} bytes in length, including the <newline> character. ...
A sequence of zero or more non-<newline> characters plus a terminating <newline> character.
テキストファイルは行か行の集合であり、行はnewlineで終わる。
今回は触れなかったですが、改行コード(LF/CRLF)も問題になることがあります。 GitはLFを推奨していますが、WindowsではCRLFがデフォルトです。 Gitの設定や、.editorconfigでLFに統一する設定があります。
git diffでは️の代わりに、「\ No newline at end of file」が出ます。
git diff
\ No newline at end of file
aaa,bbb -ccc,ddd \ No newline at end of file +aaa2,bbb2 +ccc,ddd +ccc2,ddd2
考えてみてください。FormatterやLinterはなぜ入れるんでしょう?
LinterやFormatterが怒るのは 「動かないから」じゃなくて「壊れやすくなるから」 です。
安全なコードを書くためのルールを守ることは、開発者としての責任です。