Tech`s Report

MENU

【Git】改行コードが自動変換されてしまう対処法〜Windowsでチェックアウト・コミット時の注意

フリーエンジニア向け案件を紹介【BTCエージェント】

Git for Windowsをデフォルトでインストールしてしまうと、改行コードがCRLFの資材をコミットするとLFに自動変換されてしまいます。 またLFの資材をチェックアウトするとCRLFに変換されます。

Linux上のシェルなどはCRFLでリリースしてしまうと動かないなど問題が発生してしまいます。 Gitの自動変換周りの私の理解があいまいだったため、いろいろと動作確認しながら検証し、どう設定すべきかを考察しました。

改行コードの自動変換をOFFにするコマンド

まず結論ですが、自動変換の設定はGitBashにログイン後に以下のコマンドですぐにOFFにできます。

・改行コード変更コマンド

git config --global core.autocrlf false

・変更後の確認

git config --global -l

を入力し「core.autocrlf=false」になっていればOKです。

これはglobalに設定しているためすべてのリポジトリで改行コードの自動変換がOFFになります。 Localに同様に設定すればリポジトリ単位で変更可能ですので適宜用途に応じて変更してください。

 

改行コードが自動変換される原因

Git for windowsでインストールする際にデフォルトでインストールする場合に自動変換設定がONになるため一般的に自動変換されている設定のユーザが多い、というのが現状です。
 

覚えていないかもしれませんが、インストール時の以下セットアップ画面の際です。
デフォルトだと一番上の自動変換ONにチェックが入っています。 f:id:TechnologyShare:20200504175258p:plain

 

自動変換の種類

Git for Windowsの改行コードの自動変換には3種類あります。

設定 コミット チェックアウト
true(デフォルト) CRLF→LF LF→CRLF
input CRLF→LF 変換なし
false 変換なし 変換なし

一見「true」でも最終的にCRLFでコミットしたものはチェックアウト時にCRLFになるため問題なさそうに見えますがそんなことはありません。  
 

自動変換が「true」のままだとどうなる?

ここが一番重要なポイントですが、プロジェクト参加者がtrueで運用を既に開始してしまっている場合もあると思います。
その際にどのようなことが発生するかを少し動作確認しながらまとめてみました。
 

リポジトリからダウンロードする際にLFを取得してしまう

例えばリポジトリからチェックアウト操作ではなく、直接ダウンロードする際に本来「CRLF」であるファイルが「LF」に変換されているため、「LF」のまま取得してしまいます。
 
f:id:TechnologyShare:20200504184655p:plain

LFのファイルがいつのまにかCRLFに

「LF」でリポジトリで管理されているファイルに対してある人がチェックアウトした場合、ローカル環境に「CRLF」として取得してしまします。
f:id:TechnologyShare:20200504185539p:plain

例えばshellなども管理していた場合、リリース担当者がshellをCRLFで取得してしまいます。(これでshellが動かずや夜間バッチが止まるという障害をみたことがあります。)  

最後に

私自身Gitのこの自動変換のせいで本番障害を経験しております。今回自分自身の整理と理解のために本記事を記載しましたが、少しでもGitの運用などを担当した方の参考になれば幸いです。