WindowsでgitにCR + LFではなくLFを使用させるにはどうすればよいですか?


335

私はちょうど使用して、Windowsの下で、チェックアウトファイルにgitのを強制したいLFではありませんCR+LF。2つの構成オプションを確認しましたが、設定の正しい組み合わせを見つけることができませんでした。

すべてのファイルを変換し、ファイルをLF保持したいLF

備考:使用しましたautocrlf = inputが、コミットしたときにファイルが修復されるだけです。強制的に使用させたいLF

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

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

2
autocrlf=input正しいオプションです。もちろんcr+lf、リポジトリに本当にあるファイルから保護cr+lfしたり、gitに追加する前に別のツールでファイルを作成したりすることはできません。これが機能しないという問題は何ですか?
CBベイリー

2
リポジトリ内のファイルはすでに使用されているだけですLFが、Windowsでそれらを取得すると、msysgitはに変換しますCR+LF
ソリン

あなたの設定には何かがあるはずです。私はmsysgitインストールでこれをテストしました。にautocrlf設定するとinput、gitはlf改行をそのままにします。の出力を投稿できますgit configか?
CBベイリー

1
その場合は、バグを記録することをお勧めします。できれば、問題を示すテストリポジトリを指定し、表示されている動作が間違いなく間違っているため、再現する手順を含めます(ただし、再現できません)。
CBベイリー

1
小さなヒントは、自分が思っている「git」でgitコマンドを実行していることを確認することです。たとえば、WindowsにGitをインストールし、CygwinにGitをインストールしている場合は、適切なGit構成を設定していることを確認してください。
2015年

回答:


106

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

msysgitを使用してチェックアウトされたファイルが使用していてCR+LF、msysgitにそれらを強制的に取得させたいLF

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

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

(とコメントで述べたことでを参照.gitattributes行末変換)任意のを避けるために、CRLF正しいとファイルの変換をeol

そして、私は常に git config --global core.autocrlf false変換を無効にすることをお勧めしました(すべてのバージョン管理されたファイルに適用されます)

クロスプラットフォームのgit構成のベストプラクティスをご覧ください

Git 2.16(2018年第1四半期)以降git add --renormalize .これらの.gitattributes設定をすぐに適用するために使用できます。


しかし、2番目のより強力なステップには、gitattributeフィルタードライバーが含まれ、スマッジステップが追加されます。

フィルタードライバー

作業ツリーを更新するときはいつでも、スクリプトは、で指定したファイルに対してのみ.gitattributes、強制するLF eolその他のフォーマットオプションを強制できます。
" clear"スクリプトが何も実行しない場合は、(コミット後に)ファイルを変換し、必要な形式を正確に適用します。


1つの質問:* .txtは、.txt拡張子が付いたすべてのファイル、またはすべてのテキストファイル(非バイナリ)を指しますか?プロジェクトで使用するすべての種類のファイル拡張子のリストを作成することはできません。
ソリン

1
@Sorin:.txt拡張子が付いたすべてのファイル。*に一般化する前に、最初にこれを確立して特定のグループでテスト!*.xyz ...し、いくつかのファイルをそのルールから除外する否定ルールを追加することをお勧めします。
VonC

1
これで、.gitattributes行は次の*.txt text eol=lfようになります。git

@grandchildありがとうございます。見やすくするために、回答にコメントを含めました。
VonC

私たちが追加.gitattributesする必要があると思いますgit add --renormalize .
shuva

460

WindowsでLFの末尾を取得する適切な方法は、最初に次のように設定core.autocrlfすることfalseです。

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

構成が完了したら、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 .

3
致命的なパススペックを取得しています ''直後にどのファイルとも一致しませんでしたgit diff --cached --name-only -z | xargs -0 git add
CMCDragonkai '18年

3
の出力はgit diff --cached --name-only何ですか?
クロニアル2014年

1
問題のレポ複製するときにこの構成を設定できることは言及する価値があるかもしれませんgit clone --config core.autocrlf=false <repo path>
クリスロング

240

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

私がうまくいくのは次のとおりです:

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

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

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

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

これにより、現在のディレクトリ()から、編集したファイル()を除くすべてのファイル(rm)が再帰的に(r)プロンプト()なしで削除さ-fれます。その後、彼らは自分の本当の行末(レポで何マッチング)を持っている状態にこれらのファイルのすべてを返します。--cached.reset

リポジトリ内のファイルの行末を修正する必要がある場合は、IntelliJやSublime Textのように一括で実行できるエディターを入手することをお勧めしますが、これをサポートしている優れたものがあると思います。


1
異なる行末処理を必要とするサブディレクトリを持つ単一のリポジトリがあります。そのため、グローバルオプションを設定しても機能しません。単一のリポジトリでもそうではありません。これらの同じ設定をどのように.gitattributesに適用しますか?
RobG 2016

Notepad++右下隅に現在開いているファイルの行末も表示されます。そのフィールドを右クリックすると、行末を変更できます。
winklerrr 2018

1
このcore.autocrlf inputオプションはcore.eol設定を上書きするため、両方の設定は冗長です。(git-scm.com/docs/git-configを参照)
Andrew Marshall

1
ありがとう、あなたの助けを借りて私はlintとLinuxを征服しました。ファイルをチェックインできるようになりました。
GC_

57

環境

もし、あんたが

  1. すべてのユーザーにテキストファイルのLF行末を強制し、
  2. すべてのユーザーがgit configを変更することを保証することはできません。

git 2.10以降でそれを行うことができます。2.10以降は、eol = lfとともにtext = autoの動作を修正したため、必須です。ソース

解決

入れて.gitattributes、以下の内容を持つあなたのgitリポジトリのルートにファイルを:

* 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

3
これは私にとって最良の解決策でした。また、これをeditorconfig.orgと組み合わせて、Intellijで書き込むときにLF EOLを書き出すようにしました。
Jazzepi 2018

これは断然最良の解決策です。設定コマンドを手動で実行する必要はありません!
Cameron Tacklind

26

core.autocrlf=input必要な設定には適切ですが、変更を有効にするにはa git update-index --refreshやaを実行する必要がある場合がありますgit reset --hard

core.autocrlf設定するとinput、gitはチェックアウト時に改行変換を適用しません(したがって、リポジトリにLFがある場合はLFを取得します)が、作業中にいくつかのCRLFが失敗して導入された場合に備えて、どういうわけか、彼らはレポに進まないでしょう。


19
コマンドはgit rm --cached -rである必要があります。&& git reset --hard
koppor

0

この問題の解決策は次の場所にありますhttps : //help.github.com/en/github/using-git/configuring-git-to-handle-line-endings

Windowsでこの問題を解決する方法の簡単な説明:

行末のグローバル設定git config core.autocrlfコマンドを使用して、Gitが行末を処理する方法を変更します。引数は1つです。

Windowsでは、設定にtrueを渡すだけです。例:C:> git config --global core.autocrlf true

幸運を祈ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.