7

この投稿に基づく: `.gitattributes` ファイルの `text=auto` の目的は何ですか? .gitattributes ファイルに次のものがある場合、行末はテキスト ファイルのLFに 変換されます。

* text=auto

これをローカルリポジトリでテストしました:

$ git add -A
warning: LF will be replaced by CRLF in [bla]/.gitattributes.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in [bla]/.gitignore.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in [bla]/README.md.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in [bla].csproj.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in 

しかし、そこにはCRLFに変換されると書かれています。上記の投稿では、このテストでは当てはまらないLFに変換されると書かれています。

したがって、次のようです。

* text=auto

OS に基づいて行末タイプに変換されます (Windows では CRLF、Linux では LF)。しかし、それはここで説明されていることではありません:

https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

以下のコメント/回答に基づいて、これが原因で警告が発生したようです:

* text=auto

.gitattributes ファイルで:

warning: LF will be replaced by CRLF in [bla]/README.md.
The file will have its original line endings in your working directory.

実際には、チェックアウトを実行すると(次にリポジトリから作業ディレクトリにファイルをチェックアウトするとき)、現在LFで終わるテキスト ファイルがCRLFを持つように変換されることを意味します。

警告は、チェックイン行にLFエンディングがあることに対処していません。これは、ドキュメントに次のように記載されています。

https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

文字列値 "auto" に設定 テキストが "auto" に設定されている場合、パスは自動行末正規化用にマークされます。Git がコンテンツがテキストであると判断した場合、その行末はチェックイン時に LF に正規化されます。

4

1 に答える 1

6

このメッセージは少し紛らわしいです。

Git は、現在の行末変換設定と同じようにファイルを往復しない場合は常に警告します。この警告は、Git が CRLF をリポジトリに配置しようとしているからではありません (そうではありません)。この警告は、Git がチェックアウトするファイルが、現在ディスク上にあるファイルと同じでないために発生します。

何らかの理由で、作業ディレクトリ内のファイルの行末は Unix スタイル (または Unix スタイルと Windows スタイルの混合) になっています。これは 16 進エディタで確認できるはずです。たとえば、Unix スタイルの行末を持つファイルがあります。

C:\Temp>hexdump /C foo
00000000  68 65 6c 6c 6f 21 0a                              |hello!.|
00000007

ファイルをリポジトリに追加した場合 (* text=autoまたはを使用core.autocrlf=true):

C:\Temp>git add foo
warning: LF will be replaced by CRLF in foo.
The file will have its original line endings in your working directory.

git が示すように、現在の作業ディレクトリにある私のファイルには、元の (Unix スタイルの) 行末があります。

C:\Temp>hexdump /C foo
00000000  68 65 6c 6c 6f 21 0a                              |hello!.|
00000007   

ただし、リポジトリ内のファイルには Unix スタイルの行末もあります。

C:\Temp>git ls-files --stage
100644 4effa19f4f75f846c3229b9dbdbad14eff362f32 0       foo

C:\Temp>git cat-file blob 4effa19 | hexdump /C
00000000  68 65 6c 6c 6f 21 0a                              |hello!.|
00000007

しかし、ファイルの内容を作成するように git に依頼する、別のファイルが作成されます。つまり、CRLF 行末を持つファイルが作成されます。これは、警告が実際に示しているものです。

C:\Temp>del foo

C:\Temp>git checkout -f foo

C:\Temp>hexdump -C foo
00000000  68 65 6c 6c 6f 21 0d 0a                           |hello!..|
00000008

したがって、このメッセージは、このファイルの次のチェックアウトが、現在ディスクにあるものと実際には一致しないことを警告するためのものです。この場合、これは無害かもしれませんが、行末構成が一致することが重要であるファイルを追加する場合、これは非常に悪いことです。

于 2015-11-23T18:19:49.870 に答える