web-dev-qa-db-ja.com

`.gitattributes`ファイルの` text = auto`の目的は何ですか?

ほとんどの場合、.gitattributesファイルには* text=autoがあります。そのファイルのtext=autoの目的は何ですか?

117
Fizer Khan

行末が確実に正規化されるようにします。ソース: Kernel.org

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

行末の正規化を強制するソースコード管理システムと相互運用する場合、または単にリポジトリ内のすべてのテキストファイルを正規化する場合は、代わりにすべてのファイルのテキスト属性を「auto」に設定する必要があります。

これにより、gitがテキストと見なすすべてのファイルに、リポジトリ内の正規化された(LF)行末が含まれることが保証されます。

61
Dave Zych

ドキュメント から:

.gitattributes(または.git/info/attributes)ファイルの各行の形式は次のとおりです。

pattern attr1 attr2 ...

したがって、ここでは、パターンは*であり、これはすべてのファイルを意味し、属性はtext=autoです。

text=autoは何をしますか?ドキュメントから:

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

有効になっていない場合のデフォルトの動作は何ですか?

不特定

テキスト属性が指定されていない場合、Gitはcore.autocrlf構成変数を使用して、ファイルを変換する必要があるかどうかを判断します。

core.autocrlfは何をしますか?ドキュメントから:

   core.autocrlf

この変数を「true」に設定することは、すべてのファイルでテキスト属性を「auto」に設定することとほぼ同じです。ただし、テキストファイルの正規化は保証されません。リポジトリにCRLFを含むファイルは変更されません。リポジトリに正規化された行末がなくても、作業ディレクトリにCRLF行末を含める場合は、この設定を使用します。この変数は入力に設定できます。その場合、出力変換は実行されません。

これが泥のようにはっきりしていると思うなら、あなたは一人ではありません。

これは私の言葉で* text=autoが行うことです:誰かがファイルをコミットすると、Gitはそのファイルがテキストファイルであるかどうかを推測し、つまり、すべてのCR + LFバイトがLFバイトに置き換えられたバージョンのファイルをコミットします。作業ツリーでのファイルの表示には直接影響しません。ファイルをチェックアウトするときにLFバイトをCR + LFバイトに変換する他の設定があります。

勧告:

私はnot* text=auto.gitattributesファイルに入れることをお勧めします。代わりに、次のようなものをお勧めします。

*.txt text
*.html text
*.css text
*.js text

これは、どのファイルがテキストファイルであるかを明示的に指定し、オブジェクトデータベースでCRLFをLFに変換します(作業ツリーではありません)。 * text=autoのレポジトリがあり、Gitはイメージファイルがテキストファイルであると間違って推測し、CR + LFバイトをLFバイトに置き換えて破損させました。オブジェクトデータベース。デバッグするのは楽しいものではありませんでした。

* text=autoを使用する必要がある場合は、.gitattributesの最初の行として配置し、後の行で上書きできるようにします。これは、ますます人気のあるプラクティスになりつつあるようです。

60
Flimm

その構成は、行末の処理方法に関するものです。有効にすると、リポジトリ内のすべての行末がLFに変換されます。作業ディレクトリで行末がどのように変換されるかを処理する他のフラグがあります。問題に関する詳細はこちら: https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

7
Karl Zöller