ES部の岡庭です。今回は以前担当していたプロジェクトのgit管理でつまづいた内容をまとめます。
はじめに
本題の前に改行コードというものについて少し話します。
テキストファイル等でエンターキーで改行した際「改行」を表す文字というかコードが打たれるわけですが、その「改行」の種類が複数存在します。
使うOSによって主流の改行コードが異なるようです。
- Windows:CR+LF
- Mac :LF
⇒このCRとかLFとかいうのが改行コードと呼ばれています。
プログラマーがMac、プランナーがWindowsという環境では改行コードの統一が必要です。
どんな問題が起きるのか
SourceTreeやTortoiseGitを使用しているとチェックアウト/コミット時にgitがWindowsに合わせた改行コードに自動変換する機能(AutoCrlf)が初期設定時のデフォルトはtrueになっています。
この設定が混在した状態になると、pullしただけで 触ってないのに全ファイル全行に改行コードの差分が出る状態 になったりします。
git上では変更として全行真っ赤に差分検知されますが、目視で違いに気付くのは難しいです。
こうなると本当の差分が埋もれてチェックの妨げになるため、ConnectではWindowsでgitを使用するメンバーは全員AutoCrlfの設定を統一するようにしていました。
WindowsとMacが混在するプロジェクトで、git上でテキストファイル系(csv/html/xml等)を扱う場合に注意が必要です。
どう向き合うべきか
このAutoCrlfという設定自体は悪いものではなく、リポジトリにCRLFが混ざってしまうということをユーザーに意識させずに未然に防いでくれる機能なので通常はありがたいものです。
問題は、プロジェクトメンバーのAutoCrlfの設定が統一されていないことで、falseユーザーがCRLFのままコミットした状態で、trueのユーザーがチェックアウトするとそれ以降全部のファイルが差分検知される状態になってしまいます。
設定値 | チェックアウト時 | コミット時 |
true | LF → CRLF | CRLF → LF |
input | 変換しない | CRLF → LF |
false | 変換しない | 変換しない |
設定の種類は表の3種類があり、windows作業者は基本的にはtrueかinputで統一しておくのが安定なのかなと思いました。
エンジニア側でビルド前にLF置換作業を行う等のセーフティネットがあるのであればfalse統一でもいいかもしれませんが、falseとそれ以外が混ざると混乱が生まれるのでプロジェクト全体で方針を決めるのが良いと思います。
変更方法
初期設定で設定をtrueにするか選択できるようになってますが、初期設定をすり抜けた場合の修正方法が少しわかりにくかったので紹介します。
SourceTreeの場合
操作 > ターミナルで開く > 黒画面のターミナルが開くので以下のコマンドを入力しEnter
git config --global core.autocrlf 【設定値】
【設定値】には、true / input / falseの何れかを指定
TortoiseGitの場合
TortoiseGit > 設定 > 設定の出どころ[グローバル] > 自動改行コード変換[AutoCrlf]のチェックボックス
まとめ
gitの設定で勝手に改行コードが変わって、覚えのない差分が出ることがあるというお話でした。
専門分野ではないので説明に不足があったかもしれませんが、詳しく調べたい場合は以下のキーワードで検索すると詳細な記事がたくさんあります。
- AutoCrlf
- git 改行コード自動変換