🐕

[Git]改行コードがLFに変更されず大量の差分が発生した問題(Windows)/LF変換/CRLF変換

2024/12/04に公開2

起きていたこと

会社のプロジェクトの保守をするにあたり、Gitからソースをクローンして、1行だけ追記してcommitした際ページ全体が変更したことになっていた。
なぜ?と見てみると改行が元は「↓」なのに対し「↵」に変わっていた~~え~😩
なぜそうなってるかわからずめちゃくちゃ時間かかりました....ということで残しておく

前提

  • 使用PC:windows
  • 開発環境:eclipse

*参考記事
https://qiita.com/uggds/items/00a1974ec4f115616580

これを見るに

  • WindowsのGit環境では、デフォルトで core.autocrlf=true に設定されている。
  • この設定により、ローカルでは改行コードがCRLFに変換され、Gitにコミットする際にLFに戻される動作を行います。

てことは....デフォルトでtrueにしておけばコミット時勝手にLF(↓)に変換されそうなのに、私のは一生(↵)のまま....
eclips側が悪いのか?と思いだいぶ時間かけていじくりましたが治らず....

AIに聞いたらtrueだと本当は変わるはずだけど変わらないなら「.gitattributesファイルがないからかも」と言われ作ろうとしたんですけど、
「これってローカル環境とはいえ既存プロジェクトにこんなん勝手に足してリモート環境への影響大丈夫..?」と思い聞いてみると、すべてのページが改行コードが変更され大量のコミットが発生するかもと言われました。。
で、出来るわけねぇ~~🤮💦と断念.....
その後結局git側の設定だとわかりやらなくて済みました。AIの言う事に疑問を持つのは大切ですね。

解決策

結論から言うと、クローンする前に下記コードで設定を変えたことで改行コードの自動変換が行われなくなり、問題が解消した🌟

 git config --global core.autocrlf false
  • core.autocrlffalseにした効果
    Windows環境では、デフォルトでcore.autocrlftrueになっています。
    この設定により、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:可能性あり。ただし、リポジトリの設定や環境による影響を考慮する必要がある。
理由

  1. .gitattributes ファイルの影響
    クローンするリポジトリに.gitattributesが存在する場合、その内容がcore.autocrlfより優先されます。
    例えば、以下のような設定が .gitattributes に記載されているとします:
.gitattributes
* text=auto

この設定があると、GitはファイルをLFに統一しようとします。
結果として、ローカルでのCRLF変換が意図通りに動作しない場合があります。

  1. 既存のファイルの改行コードの状態
    リポジトリ内のファイルがすでにLFでコミットされている場合、core.autocrlf=true の設定でもローカルでCRLFに変換されないことがあります。
    これはGitが既存のファイルを「正しい形式」と認識して変換をスキップするためです。

やってみないとわからんという感じやね。とりあえず治ってよかった🥴

Discussion