Gitでcore.autocrlf = trueを使用する必要があるのはなぜですか?


296

WindowsとOS Xの両方からアクセスできるGitリポジトリーがあり、CRLF行末のファイルが既にいくつか含まれていることを知っています。私の知る限り、これに対処するには2つの方法があります。

  1. 設定するcore.autocrlfにはfalse、どこにでも

  2. 指示に従ってくださいここだけLF行末を格納するリポジトリを変換するには(GitHubののヘルプページにエコー)、およびその後の設定core.autocrlftrueWindows上およびinputOS X上でこれを行うことに伴う問題は、私は、リポジトリ内の任意のバイナリファイルを持っている場合ということですそれ:

    1. gitattributesでバイナリとして正しくマークされていない、および
    2. CRLFとLFの両方が含まれている

    それらは破損します。リポジトリにそのようなファイルが含まれている可能性があります。

では、なぜGitの行末変換をオフにすべきではないのでしょうか。core.autocrlfスイッチをオフにしたことで問題が発生することについて、ウェブ上では漠然とした警告がたくさんありますが、特定の警告はほとんどありません。私がこれまでに見つけた唯一のことは、kdiff3がCRLFエンディングを処理できない(私にとっては問題ではない)ことと、一部のテキストエディターに行末の問題がある(私にとっても問題ではない)ことです。

リポジトリは私の会社の内部にあるので、異なるautocrlf設定や行末の要件を持つ人々とリポジトリを共有することを心配する必要はありません。

行末をそのままにしておくことに他に問題はありますか?


1
stackoverflow.com/questions/2333424/...助けを?私はautocrlf、虚偽のままにする特定の理由へのリンクを持っています。
VonC、

3
@VonCありがとうございます。しかし、社内のすべてのユーザーが<code> autocrlf </ code>をfalseに設定し、現在それが最良のオプションであると信じていることを私はすでに説明することができます。しかし、私がautocrlf 設定する必要があると言う人(GitHubなど)はたくさんいるのに、実際の詳細はないので、そうすべきでない理由があるかどうか知りたいのです。
リッチ

3
@VonCすなわち、私はautocrlffalse に設定する理由を探していません。これをtrueに設定する理由を探しています。
リッチ

9
なぜ使用しないのですか?autocrlf = inputそれは2つの極端な方法の間の完璧な解決策のようです:あなたはリポジトリをCRLFのがらくたからきれいに保ち、ローカルのWindows開発者はローカルファイルに魔法が自動的に実行されることなく、何でも使用できます。(彼らはさまざまな理由でローカルでLFを必要とするかもしれないのでtrue、私の意見では悪いです。)私はを使用することのマイナス面を見ることができませんautocrlf = input
iconoclast 2012

7
@iconclast、私が遭遇した1つの理由は、WindowsバッチファイルとUnixシェルスクリプトの両方を含むディストリビューションをビルドする場合です。どちらの場合も正しい行末を使用したいのですが、Gitが何らかの方法で明示的に設定した後でも、Gizが物事をスウィズルしている場合は、これを行うのは困難です。
user1809090 2014

回答:


227

に設定autocrlfする特定の理由trueは次のとおりです。

  • 避けるgit statusなど、すべてのファイルを示すmodifiedため、Windowsの一つにUnixベースのEOLのGitリポジトリのクローンを作成する際に行う自動EOL変換のを(参照問題83インスタンス用の)
  • そして、あなたのコーディングツールが何らかの形で依存するネイティブファイルでのEOLスタイルビーイングの存在:

ネイティブのEOLを処理する必要がある特定の処理を確認できない場合は()に任せるautocrlffalseほうがよいでしょうgit config --global core.autocrlf false

この構成はローカル構成になることに注意してください(構成がリポジトリからリポジトリにプッシュされないため)

そのリポジトリのクローンを作成するすべてのユーザーに同じ設定が必要な場合は、ファイルの属性を使用して、「gitでの最適なCRLF処理方法は何ですか?」を確認してください。text.gitattributes

例:

*.vcproj    text eol=crlf
*.sh        text eol=lf

注:git 2.8(2016年3月)以降、マージマーカーはCRLFファイルに混合行末(LF)を導入しなくなりました。「「<<<<<<< HEAD」マージ行でGitにCRLFを使用させる
参照してください。


5
@VonCありがとう!これにより、安全に使用できると確信できますautocrlf=false。興味深いことに、autocrlfをfalseに設定していてもgitがなぜeol変換を行うのか知っていますか?
リッチ

14
@VonC:この答えは正しいとは思いません。Windowsでcore.autocrlf = trueを使用すると、期待どおりに動作します。リポジトリからのすべてのファイル(このシナリオではLFの行末が必要です)は、Windows PCへのチェックアウト時にCRLFの行末に変換されます。すべてのファイルは、Windows PCからのコミット時に改行されてLF行に変換されます。問題が発生する方法は、最初に間違ったcore.autocrlf設定を使用してWindows PCにチェックアウトすることです(これは完全に行うのが非常に簡単です)。
Michael Maddox

3
@Michaelでは、その場合core.autocrlf=false、私のシナリオで使用しない唯一の理由は、行末で混乱するツール/エディターがあった場合でしょうか?
リッチ

49
私は間違いなくを使用falseします。バックグラウンドで発生する自動または魔法のことの大ファンではありません。ただ、使用\nしてUTF-8どこでも、あなたは罰金になります。慣習やルールがあることを理解できず、UTF-8またはの使用を忘れた場合\n、誰かが手動で変換して顔を叩きます。
タワー

5
@ Pauld'Aoust すべてのファイルに無差別に適用されるこのグローバル設定を使用するのではなくcore.eol.gitattributesファイルの属性を介してCRLFを必要とするファイルのタイプを指定することを好みます。core.autocrlf
VonC 2013

40

私は.NET開発者であり、GitとVisual Studioを何年も使用しています。私の強力な推奨事項は、行末をtrueに設定することです。そして、リポジトリの存続期間中にできる限り早くそれを実行してください。

そうは言っても、Gitが行末を変更するのは嫌いです。ソース管理は、私が行う作業を保存および取得するだけで、変更することはできません。ずっと。しかし、そうです。

すべての開発者がtrueに設定されていない場合は、最終的に1人の開発者がtrueに設定されます。これにより、リポジトリ内のすべてのファイルの行末がLFに変更されます。また、ユーザーがfalseに設定した場合、それらをチェックアウトすると、Visual Studioから警告が表示され、変更するように求められます。あなたは2つのことが非常に速く起こるでしょう。1つは、これらの警告がますます多くなることで、チームが大きくなるほど多くの警告が表示されます。2つ目、さらに悪いことに、変更されたすべてのファイルのすべての行が変更されたことが示されます(すべての行の行末が本当の人によって変更されるため)。最終的には、レポの変更を確実に追跡できなくなります。全員を偽りにしようとするよりも、誰もが真実を保つようにする方がはるかに簡単でクリーンです。信頼できるソース管理がすべきでないことをしているという事実に耐えるのは、恐ろしいことです。ずっと。


私の会社は十分に小さいので、どこでもfalseを使用することを簡単に義務付けることができます。大企業がポリシーを使用してこれを実行できると思っていましたが、これが「true」を使用する正当な理由だと思うので、賛成していますとにかく。ありがとう!
リッチ

1
これをポリシー(ファイル強制)で実行する場合の問題は、Windowsマシンでローカル、グローバル、および非表示の構成ファイル(ProgramData / Git / Confg)を使用できることです。ローカルをリポジトリにチェックインすることで強制できますが、グローバルと非表示のファイルが優先されます。また、ローカルとグローバル(または非表示)を異なるものにすることもできます。同じである場合、それらは同じマシン上で互いに競合し、何もない場合に行末エラーを引き起こします。これを突き止めるのは大変です。:(
JGTaylor 2016年

7
まさに私が思うこと。それは、ソースコントロールの仕事ではなく、コードファイルをいじるのではありません。行末は単に編集ツールの問題であり、それ以上のものではありません。
TuncayGöncüoğlu16年

6
プロジェクトがWindowsのみの場合、問題はありません。ただし、あなたまたは同僚が* nixプラットフォームで作業している場合は、「強力な推奨」が問題の原因になります。shebangで終わるbash、perl、またはpythonスクリプトを実行してみて\r\nください。
phuclv 2016年

6
あなたが説明した状況はGITの問題ではないので、設定をFALSEに設定してください。インスタッド、それはチームワークの問題です。「最終的に1人の開発者が設定する」とはどういう意味trueですか?そもそもなぜそれを許可するのですか?git repoにアクセスするように設定すると、異なる言語で特定の領域を汚染することを許可しないのと同じように(そのため、作業している誰もがそれを読み取ることができます)、または選択したとおりにブランチ/マージ/リベースなどを維持するのと同じですポリシー、彼らは明確なルールを取得する必要があります:正しいcrlfを設定します。
ケツァルコアトル2017年

12

アップデート2

Xcode 9は、ファイルの現在の行末を無視する「機能」を備えているように見えます。代わりに、ファイルに行を挿入するときにデフォルトの行末設定を使用すると、行末が混在するファイルになります。

このバグはXcode 7には存在しなかったと確信しています。Xcode 8については不明です。良いニュースは、Xcode 10で修正されたようです。

それが存在していた間、このバグは私が質問で参照するコードベースに少量の陽気さを引き起こし(今日ではこれを使用していますautocrlf=false)、多くの「EOL」コミットメッセージにつながり、最終的にはgit pre-commitフックを作成して確認しました混合行末の導入を防止します。

更新

注:VonCで指摘されているように、Git 2.8以降、マージマーカーはUnixスタイルの行末をWindowsスタイルのファイルに導入しません

オリジナル

この設定で気付いた小さな問題は、マージの競合がある場合、gitが追加した行に違いをマークアップすることで、ファイルの残りの部分があったとしてもWindowsの行末がないため、結果的に行末が混在しているファイルの場合、例:

// Some code<CR><LF>
<<<<<<< Updated upstream<LF>
// Change A<CR><LF>
=======<LF>
// Change B<CR><LF>
>>>>>>> Stashed changes<LF>
// More code<CR><LF>

これで問題が発生することはありませんが(両方のタイプの行末を処理できるツールであれば、行末が混在している場合にも対応できると思います-私たちが使用しているすべての行末は、確かにそうです)、それは注意すべきことです。

その他に、*を使用git diffして、Windowsの行末を持つファイルへの変更を表示すると、追加された行に改行が表示されるため、次のようになります。

    // Not changed

+   // New line added in^M
+^M
    // Not changed
    // Not changed

*「問題」という用語にはあまり意味がありません。


2
注:Visual Studioがこのようなファイルを検出すると、行末を正規化するように提案されます。Windowsの行末を選択するか、行末を正規化しないことを選択すると、正常に機能します(VSが正しく表示するため、競合が解決されると、問題の行は削除されます)。
リッチヤン

2
残念ながら、企業バージョン管理ナチスは問題ではない(マージ競合マーカーのLF)ことに同意しません。
Ilia G

1
マージ競合マーカーのLFは問題にはならないことに同意します。これらの行はとにかくレポにコミットするべきではありません。
2015年

1
注:git 2.8(2016年3月)以降、マージマーカーは実際にはCRLF行で終了します。stackoverflow.com/a/35474954/6309を
VonC '18
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.