[Git]改行コードがLFに変更されず大量の差分が発生した問題(Windows)/LF変換/CRLF変換
起きていたこと
会社のプロジェクトの保守をするにあたり、Gitからソースをクローンして、1行だけ追記してcommit
した際ページ全体が変更したことになっていた。
なぜ?と見てみると改行が元は「↓」なのに対し「↵」に変わっていた~~え~😩
なぜそうなってるかわからずめちゃくちゃ時間かかりました....ということで残しておく
前提
- 使用PC:windows
- 開発環境:eclipse
*参考記事
これを見るに
- WindowsのGit環境では、デフォルトで core.autocrlf=true に設定されている。
- この設定により、ローカルでは改行コードがCRLFに変換され、Gitにコミットする際にLFに戻される動作を行います。
てことは....デフォルトでtrueにしておけばコミット時勝手にLF(↓)に変換されそうなのに、私のは一生(↵)のまま....
eclips側が悪いのか?と思いだいぶ時間かけていじくりましたが治らず....
AIに聞いたらtrue
だと本当は変わるはずだけど変わらないなら「.gitattributes
ファイルがないからかも」と言われ作ろうとしたんですけど、
「これってローカル環境とはいえ既存プロジェクトにこんなん勝手に足してリモート環境への影響大丈夫..?」と思い聞いてみると、すべてのページが改行コードが変更され大量のコミットが発生するかもと言われました。。
で、出来るわけねぇ~~🤮💦と断念.....
その後結局git側の設定だとわかりやらなくて済みました。AIの言う事に疑問を持つのは大切ですね。
解決策
結論から言うと、クローンする前に下記コードで設定を変えたことで改行コードの自動変換が行われなくなり、問題が解消した🌟
git config --global core.autocrlf false
-
core.autocrlf
をfalse
にした効果
Windows環境では、デフォルトでcore.autocrlf
がtrue
になっています。
この設定により、Gitはローカルで改行コードをCRLF
に変換し、コミット時にLF
に戻す動作をします。
これをfalse
にすることで、自動変換を無効にし改行コードがそのまま扱われるようになります。
まとめ
- クローン時の改行コード変換はクローン時の設定に依存する。
- そのため「なぜがLFに自動変換されるはずの設定がうまく動かない」という問題が発生
(git config core.autocrlf false(リポジトリ単位)
で設定してもすでにクローンされたリポジトリの .git/config に設定が保存されていたため、新しい設定が反映されなかった可能性があり変わらなかった。) - 🌟
git config --global core.autocrlf false
と--global
を入れてそのPC上のすべてのリポジトリに対して設定が適用させてからcloneしたことで、適切にLF/CRLFの変換が無効化されました。
疑問
これって最初true
でうまくいかなかったのもクローンしてきたときの設定が優先されて動かなかったのであれば、これもクローン前に↓すればうまくいったのでは...???
git config --global core.autocrlf true
A:可能性あり。ただし、リポジトリの設定や環境による影響を考慮する必要がある。
理由
- .gitattributes ファイルの影響
クローンするリポジトリに.gitattributes
が存在する場合、その内容がcore.autocrlf
より優先されます。
例えば、以下のような設定が .gitattributes に記載されているとします:
* text=auto
この設定があると、GitはファイルをLFに統一しようとします。
結果として、ローカルでのCRLF変換が意図通りに動作しない場合があります。
- 既存のファイルの改行コードの状態
リポジトリ内のファイルがすでにLFでコミットされている場合、core.autocrlf=true の設定でもローカルでCRLFに変換されないことがあります。
これはGitが既存のファイルを「正しい形式」と認識して変換をスキップするためです。
やってみないとわからんという感じやね。とりあえず治ってよかった🥴
Discussion
cloneした後に設定変えた時の話、もし参考になれば幸いです:
ありがとうございます!😳🌟