Windows gitの「警告:LFはCRLFに置き換えられます」、その警告の尾は後方ですか?


147

env:

  • Windows 7
  • msysgit

とき私はgit commit、それは言う:

warning: LF will be replaced by CRLF. 

この警告の尾は後ろ向きですか?
私はWindowsでファイルを編集します。CRLFこの写真のように、行末はです。git は、リポジトリにコミットするためにに
ここに画像の説明を入力してください
変更しLFます。
だから私は正しい警告だと思います:

warning: CRLF will be replaced by LF. 


2
@devnull警告は後ろ向きだということですか?
Honghe.Wu 2013

@ Honghe.Wuいいえ、Windowsにはありません。私は以下の私の回答
VonC

11
確かに、警告は後ろ向きのようです。コミット時にCRLFに変換することについてこの警告を受け取るのは本当に混乱します。警告が逆方向であるため、Gitによる空白の処理を説明することは役に立ちません。
Stijn de Witt 2016

1
@StijndeWitt私はそれを賛成するための回答としてあなたにコメントしてもらいたいです。
user1460043 2016年

回答:


185

警告:LFはCRLFに置き換えられます。

使用しているエディターによっては、LFを含むテキストファイルをCRLFで保存する必要はありません。最近のエディターはEOLスタイルを保持できます。しかし、そのgit config設定はそれらの変更を要求しています...

簡単に確認してください(ここでお勧めします)。

git config --global core.autocrlf false

そうすることで、自動変換を回避し、.gitattributesファイルcore.eolディレクティブを使用してそれらを指定できます。


Windows git "LFはCRLFに置き換えられます"
この警告は後ろ向きですか?

いいえ:あなたはWindowsを使用しており、git configヘルプページに

CRLFリポジトリに正規化された行末がない場合でも、作業ディレクトリに行末を置きたい場合は、この設定を使用します。

git LFをCRLFに置き換える」で説明されているように、これは、チェックアウト(コミットではなく)でのみ発生core.autocrlf=trueます。

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

XiaoPeng回答で述べたように 、その警告は次と同じです。

警告:(現在のcore.autocrlf構成でチェックアウトするか、別のフォルダーに複製する場合)LFはCRLFに置き換えられ
ます。ファイルは、(現在の)作業ディレクトリに元の行末があります。

で述べたようgit-for-windows/gitな問題1242

私はまだこのメッセージが混乱しているように感じます。たとえば、「file.jsonファイルを削除して再度チェックアウトすると、LFはCRLFに置き換えられます」など、問題のより詳しい説明を含めるようにメッセージを拡張できます。

注:Git 2.19(2018年9月)を使用するcore.autocrlf、偽の「LFはCRLFに置き換えられます」という警告が抑制されるようになりました


以下のようquaylar当然のコメントコミットの変換がある場合、それはにあるLFのみ。

その特定の警告「LF will be replaced by CRLF」は、convert.c#check_safe_crlf()から発生します。

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

それはによって呼び出されconvert.c#crlf_to_git()、それ自体はによって呼び出されconvert.c#convert_to_git()、それ自体はによって呼び出されconvert.c#renormalize_buffer()ます。

そして、その最後renormalize_buffer()はによってのみ呼び出されmerge-recursive.c#blob_unchanged()ます。

したがって、この変換は、git commitコミットがマージプロセスの一部である場合にのみ発生するのではないかと思います。


注:Git 2.17(2018年第2四半期)では、コードのクリーンアップで説明が追加されています。

参照してください8462ff4コミットすることにより(2018年1月13日)トルステン・Bögershausenを(tboegi
(合併によりJunio C浜野- gitster-9bc89b1コミット 2018年2月13日)

convert_to_git():safe_crlf / checksafeはint conv_flagsになります

を呼び出すときにconvert_to_git()、このchecksafeパラメーターは、EOL変換(CRLF --> LF --> CRLF)が完全にラウンドトリップしない場合にどうなるかを定義しました。
さらに、行末を再正規化するか(CRLF --> LF)、そのままにするかも定義されています。

checksafeはsafe_crlf次の値を持つ列挙型でした:

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Git 2.17サイクルで8462ff4( " convert_to_git()safe_crlf/checksafeint conv_flags"、2018-01-13、Git 2.17.0)に導入されたリグレッションにより、設定にかかわらずautocrlf、書き換えによって警告メッセージが生成されることに注意してください 。safecrlf=false

Anthony Sottile()によるcommit 6cb0912(2018年6月4日)を参照してください。(合併によりJunio C浜野- -8063ff9コミットし、2018年6月28日)をasottile
gitster


1
はい、ほとんどのエディターはEOLスタイルを維持できますが、ほとんどのエディターでは、同じプロジェクトで新しいファイルを作成するときに効果がありません。LFプロジェクトをチェックアウトしないでください。「psh、私のエディターはLFの行末を処理できます。autocrlfは必要ありません」と考え、手動で新しいファイルをLFの行末に設定することを忘れてください。

15
@VonC私は私がそれを得ていないことを告白しなければなりません。Git-Bookは、コミット時にCRLFの行末をLFに自動変換することでGitがこれを処理できると述べており、ファイルシステムにコードをチェックアウトすると逆も同様です。つまり、コミット時LFに変換され、CRLFには変換されません。つまり、上記の警告は正しくありません。有するcore.autocrlf=trueます常に レポでLFに降伏し、作業ツリーの私見ではCRLF(でも、Windows以外の下)。出典:リンク
Quaylar、2014

12
「この警告は後ろ向きですか?チェックアウト時にのみ発生するはずです」コミット時にこの正確な警告が表示されます。だからはい、それは逆です。それが逆になって、私はこれを探しました。他の人もそれに気付いて良かった!これらの警告を実際に読んで、コミットメッセージでCRLFに変換されると表示されている人を見ると、非常に混乱します。
Stijn de Witt 2016

7
「つまり、この変換は、コミットがマージプロセスの一部である場合にのみ、gitコミットで発生すると思います。いいえ。これは定期的なコミットで見られます。
Stijn de Witt 2016

3
メッセージについて私を悩ませている部分は、それがまったくポップアップするということです。gitが設定したとおりにgitが実行しようとしていることを警告する必要があるのはなぜですか。「おっしゃるように、行末をまだ変換しています」という警告は必要ありません。システムが仕様どおりに動作している場合、不必要な警告を出してはいけません。
ブレントラーセン

27

はい、警告は逆です。

そして実際には、そもそも警告であってはなりません。このすべての警告が(残念ながら後方に)言っているのは、Windowsの行末を含むファイル内のCRLF文字が、コミット時にLFで置き換えられるということです。つまり、* nixとMacOSで使用されているのと同じ行末に正規化されます。

奇妙なことは何も起こっていません。これはまさにあなたが通常望む動作です。

現在の形式のこの警告は、次の2つのいずれかです。

  1. 不注意なバグと過度に慎重な警告メッセージを組み合わせたもの、または
  2. あなたが本当にこれを考えさせる非常に賢いプロット...

;)


1
奇妙なことに、Windowsのローカルファイルを強制的にLFに変換すると、ファイルをgit addすることさえできない場合、メッセージが表示され、コミットが無効になります。
phpguru 2016年

24

--7月9日に更新---

@mgiucaがコメントした「それは正しくて正確」を削除

======

いいえ。現在であなたのファイルについて話しているのではありませんCRLF。代わりに、でファイルについて話しているLF

それは読むべきです:

警告:(チェックアウトするか、現在のcore.autocrlf構成別のフォルダーに複製する場合)、LFはCRLFに置き換えられます

ファイルの元の行は、(現在の)作業ディレクトリにあります。

この画像は、それが何を意味するかを説明する必要があります。 ここに画像の説明を入力してください


1
素敵なイラスト。+1。私はあなたの答えをもっと見やすくするために私の中で参照しました。
VonC 2017年

私にとってうまくいくのは:1)core.autocrlf = false 2)Intellijで行区切り(\ n)を設定します。MacとWindowsの両方でIntellij Ideaを使用しています。
Xiao Peng-ZenUML.com 2017

これは、ファイルがWindowsで作成されたが、UNIX / Macの行末(LF)があり、git構成プロパティautocrlfがtrueの場合に発生する可能性があります。基本的にgitは作成したファイルを変更しませんが、ウィンドウの行末でチェックアウト/クローンします(autocrlf設定のため)
Patrick

1
「チェックアウトするか、現在のcore.autocrlf構成で別のフォルダーに複製するか」で修飾する必要がある場合、警告はどのように正確で正確ですか。それは元のメッセージが言うことではありません。これは、CRLFによって置き換えられる(されない可能性がある)と述べており、仮想の将来のチェックアウトではなく、リポジトリ自体にCRLFモードで格納されることを意味します。
mgiuca

12

これはすべて core.autocrlf=true

元のエラー:

警告:LFはCRLFに置き換えられ
ます。ファイルの元の行末は作業ディレクトリになります。

エラーは何を読むべきか:

警告:作業ディレクトリで LFはCRLF 置き換えられ
ますファイルはgitリポジトリで元のLF行で終わります

ここで説明:

この便利な変換の副次的影響であり、これが表示されている警告です。最初に作成したテキストファイルがCRLFではなくLFで終わっている場合、通常どおりLFで保存されますが、チェックすると後でそれはCRLFエンディングを持っています。通常のテキストファイルの場合、これは通常は問題ありません。この場合、警告は「参考情報」ですが、gitがバイナリファイルをテキストファイルであると誤って評価した場合、gitがバイナリファイルを破損するため、これは重要な警告です。

基本的に、以前はLFだったローカルファイルにローカルでCRLFが含まれるようになります。


7

git config --global core.autocrlf false グローバル設定に適しています。

ただし、Visual Studioを使用している場合は.gitattributes、プロジェクトの種類(c#クラスライブラリアプリケーションなど)を変更する必要がある場合もあります

  • 行を削除 * text=auto

1

私が設定した後core.autocrlf=true、私は私がされたとき(ノートが「CRLFをLFに置き換えられます」ではない)「LFはCRLFに置き換えられます」なっていたgit addINGの(あるいはそれにだったgit commit?)ウィンドウで編集したファイルのリポジトリに(使用しないことLF)設定するにチェックアウトされましたcore.autocrlf=true

で新しいチェックアウトを行いましたが、core.autocrlf=trueこれらのメッセージが表示されません。


0

Visual Studio 2017、2019を使用している場合は、次のことができます。

  1. メインの.gitignoreを開きます(ソリューションの他のプロジェクトで別の.gitignoreファイルを更新または削除します)
  2. 以下のコードを貼り付けます:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process

1
その「コード」は、gitでは無視されるファイルを指定するやではなく、.gitconfigまたはのような構成ファイルにあるように見えます。.git/config.gitignore
davidA

これを.git / configに追加しましたが、それでも「警告:CRLFはLFに置き換えられます」が表示されます
セルゲイ

0

単純なことをしてください:

  1. git-hub(シェル)を開き、(cd / a / b / c / ...)に属するディレクトリファイルに移動します。
  2. dos2unixを実行する(いつかdos2unix.exe)
  3. 今すぐコミットしてみてください。再び同じエラーが発生した場合。dos2unixの代わりにunix2dox(unix2dos.exeを実行する)を除いて、上記のすべての手順を実行します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.