web-dev-qa-db-ja.com

WindowsでCR + LFの代わりにLFを使用するようにgitを強制するにはどうすればよいですか?

CR+LFではなくLFのみを使用して、Windowsでgitにファイルをチェックアウトさせます。 2つの構成オプションをチェックしましたが、適切な設定の組み合わせを見つけることができませんでした。

すべてのファイルをLFに変換し、ファイルにLFを保持するようにします。

注:autocrlf = inputを使用しましたが、これはファイルをコミットするときにファイルを修復するだけです。 LFを使用して強制的に取得させます。

おそらく私はそれほど明確ではありませんでした:リポジトリは既にLFを使用していますが、msysgitを使用してチェックアウトされたファイルはCR+LFを使用しており、msysgitにLFnixの行末を強制する

>git config --list | grep crlf
core.autocrlf=input
284
sorin

OPは彼の質問に追加しました:

msysgitを使用してチェックアウトされたファイルはCR+LFを使用していて、LFでそれらを取得するためにmsysgitを偽造したいです。

最初の簡単なステップはまだ.gitattributesファイルにあります。

*.txt -crlf

、正しいeolを持つファイルのためのどんなcrlf変換も避けるために。

クロスプラットフォームのgit configのベストプラクティスを参照してください。


しかし、さらに強力な2番目のステップは、 gitattribute filter driver を含み、汚れたステップを追加します。

filter driver

ワーキングツリーを更新するときはいつでも、.gitattributesで指定したファイルに対してのみ、スクリプトはLF eolやその他の強制したいフォーマットオプションを強制することができます。
"clear"スクリプトが何もしないのなら、あなたが従う必要があるフォーマットを正確に適用して(コミット後に)あなたのファイルを変換させるでしょう。

80
VonC

WindowsでLFの末尾を取得するための適切な方法は、最初にcore.autocrlffalseに設定することです。

git config --global core.autocrlf false

Msysgitを使用している場合は、システム設定でtrueに設定されているため、これを実行する必要があります。

これでgitは行末の正規化を行いません。チェックインしたファイルを正規化したい場合は、次の操作を行います。すべてのファイルのtext=auto.gitattributesを設定します。

* text=auto

そしてcore.eollfに設定します。

git config --global core.eol lf

これで、次のコマンドを実行して、単一のリポジトリを(作業ディレクトリ内で)crlfに切り替えることもできます。

git config core.eol crlf

設定が完了したら、repoの中のすべてのファイルをgitに正規化させたいと思うかもしれません。これを行うには、リポジトリのルートに移動して次のコマンドを実行します。

git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f

Gitに作業ディレクトリのファイルも正規化させたい場合は、次のコマンドを実行してください。

git ls-files -z | xargs -0 rm
git checkout .
375
Chronial

私はこの答えにかなり頻繁に戻りますが、これらのどれも私にとってはまったく正しいものではありません。とは言っても、私にとって正しい答えは他の人の混合物です。

私が見つけたものは以下の通りです:

 git config --global core.eol lf
 git config --global core.autocrlf input

これらのグローバル設定が設定された後にチェックアウトされたレポジトリの場合、すべてがレポジトリにあるものとしてチェックアウトされます - うまくいけばLF\n)。チェックイン時に、CRLFはすべてLFに変換されます。

すでにチェックアウトした既存のリポジトリ(リポジトリの行末は正しいが作業コピーは含まない)で、以下のコマンドを実行して修正できます。

git rm -rf --cached .
git reset --hard HEAD

現在のディレクトリ(-f)から、編集したもの(--cached)を除くすべてのファイルを、プロンプト(.)なしで再帰的に(rm)削除します(r)。そしてresetは、それらのファイルすべてを、(リポジトリの内容と一致するように)それらのファイルの実際の行末がある状態に戻します。

リポジトリのファイルの行末を修正する必要がある場合は、IntelliJやSublime Textのようにまとめて編集できるエディタを使用することをお勧めしますが、これをサポートするものがあると確信しています。

185
Ben Liyanage

コンテキスト

もし、あんたが

  1. すべてのユーザにテキストファイルのLF行末を強制し、
  2. すべてのユーザーが自分のgit設定を確実に変更できるようにすることはできません。

あなたはgit 2.10からそれをすることができます。 2.10はtext = autoの動作をeol = lfと一緒に修正 であるため、2.10以降が必要です。 出典

溶液

以下の内容のgitリポジトリのルートに.gitattributesファイルを置きます。

* text=auto eol=lf

それをコミットします。

オプションの調整

また、最新のツールで目的の行末を持つ新しいファイルが作成されるように、リポジトリのルートに.editorconfigを追加することもできます。

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
34
koppor

core.autocrlf=inputはあなたが望むもののための正しい設定ですが、変更を有効にするためにgit update-index --refreshgit reset --hardをする必要があるかもしれません。

core.autocrlfinputに設定すると、gitはチェックアウト時に改行変換を適用しません(したがって、リポジトリにLFがあれば、LFになるでしょう)。何らかの形で作業コピーにCRLFを追加して導入しても、リポジトリに入ることはできません。

25
kusma