git commit get fatal error“ fatal:CRLF will be replace to LF in”


84

私はUbuntu13.10 x64を使用しており、一部の開発者がWindowsを使用しているプロジェクトに取り組んでいます。最近、gitconfigcore.eolを「lf」およびcore.autocrlf「input」およびcore.safecrlf「true」に変更しました。それ以来、ファイルをローカルリポジトリにコミットしようとすると、次のエラーが発生します。
fatal: CRLF would be replaced by LF in ......
理解していることから、core.eol「lf」とcore.autocrlf「input」に設定すると、gitは自動的にCRLFをLFに変換しますが、なぜこのエラーが発生するのですか?でる?この問題を解決するにはどうすればよいですか?

ありがとうございました。

回答:


220

これは古典的な問題です:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
Luis Tubesブログ投稿からの写真)

通常の修正は、dos2unixまたはSwiss File Knifeを使用して、これらのファイルを自分で変換することです。

私は常に維持core.autocrlffalseすること好みました。つまり、次のことを意味します。

git config --global core.autocrlf false

そのエラーメッセージはgit diff出力にも忍び寄ります:git.661346.n2.nabble.com/…– VonC 2013
22:42

8
すでにcore.autocrlf入力に設定しているのに、なぜgitがCRLFをLFに変更できないのですか?
aserww106 2013年

1
@Williamは、Linuxで作業していて、Windowsからのファイルを使用しているためです。
vonC 2013年

ありがとう、@ VonC、私はすでにdos2unixを使用してすべてのファイルを変更しているので、Windows開発者がリポジトリにコードをコミットすると、リポジトリからプルすると、gitはCRLFをLFに変換しますよね?私たちのgitサーバーはUbuntu上にあります。
aserww106 2013年

1
@William私はあなたが「私が最近変更言っていることを意味git config core.eolする」lf「とcore.autocrlf」にinput、それはすでにそこにあるファイルを変更しません:「」。それは将来に影響を与えるでしょうgit pull。現在のファイルはまだCRLFにあり、変更された場合、可能であればLFに変換され、そうでない場合は、言及したエラーメッセージがトリガーされます。
vonC 2013年

55

私は同じ問題を抱えていて、提案された解決策を試しましたが成功しませんでした。

それを機能させるには、2番目のコマンドを実行する必要がありました。

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false

5
この余分な編集にマイナスの影響はありますか?
AlleyOOP 2015

ありがとうございます!2020年に私を助けてくれます:)
Joe Spinelli

28
$ git config core.autocrlf false

3
これが何をするのかわかりませんが、機能します。致命的な警告は消え、私はもう怖くありません。
wh1tney 2014

これを行ったところgit diff、ファイル全体(1000行)が競合していると見なされました。差分ツールは3行の変更のみを確認します。
ダグルーム2015

10

dos2unixを試してみてください。

dos2unix [filename]

4

これは何千ものファイルで私に起こりました。そこで、dos2unix修正するための簡単なbashスクリプトを作成しました。LinuxまたはMacの他の誰かがそれが役に立つと思うかもしれません。

#!/usr/bin/env bash

unwindows() {

  local errmsg
  local fpath

  # base case
  errmsg="$(git add . 2>&1)"
  if [[ $? -eq 0 ]]; then
    echo 'Successfully converted CRLF to LF in all files.'
    echo 'Successfully ran "git add .".'
    echo 'Done.'
    return 0
  fi

  fpath="${errmsg#*fatal: CRLF would be replaced by LF in }"
  fpath="${fpath%.*}"

  if [[ "${fpath}" == "${errmsg}" ]]; then
    err 'Regex failed. Could not auto-generate filename from stderr.'
    return 1
  fi

  if [[ ! -e "${fpath}" ]]; then
    err "Regex failed. '${fpath}' does not exist."
    return 1
  fi

  if ! dos2unix "${fpath}"; then
    err "Failed to run \"dos2unix '${fpath}'\"."
    return 1
  fi

  # recursive case
  unwindows
}

err() {
  local -r msg="$1"
  echo "${msg}" >&2
}

unwindows

基本的に、それはやろうとしますgit add .。コマンドが失敗すると、エラー出力から互換性のないファイルの名前が取得されます。次にdos2unix、そのファイルで実行されます。git add .動作するまでこのプロセスを繰り返します。

これを実行すると、dos2unix: converting file xxx to Unix format...繰り返し表示されるはずです。そうでない場合は機能しないので、ctrl+cまたはcommand+cを押して停止します。


2
コミットされていない何千ものファイルをどうやって積み上げたのか不思議に思う人がいたら、それはリポジトリにコードで生成された画像がたくさんあるからです。私はコミットを3年か何か延期していませんでした。
GreenRaccoon23 2016年

1

git status変更済みとして表示されるすべてのファイルを追加する必要があります。

git add file1
git add file2

そして、変更をコミットします:

git commit

これにより、ローカルファイルはそのまま保持されますがautocrlf、リモートリポジトリに保持されます。


1

私は同じ問題に直面し.gitattributes、以下のように編集して修正しました。

$ vim .gitattributes

.gitattributesの2行をコメントアウトします

-* text=auto
-* text eol=lf
+# * text=auto
+# * text eol=lf

1

参考までに、これが当てはまるかどうかはわかりませんがnode_modules、段階的な変更に誤ってすべてを追加しようとすると、このエラーが発生していました。だから実際.gitignoringnode_modules私の問題を解決しました。


0

ターミナルを使用しているMacを使用していますが、コミットしようとした.htaccessファイルでこの問題が発生し、致命的なエラーが発生しました。

fatal: CRLF would be replaced by LF in .htaccess

gitフラグをオフにするだけでなく、OPリクエストのように問題を修正したかったので、ファイルごとに問題を修正するperlコマンドを提供するこの記事を見つけました。

perl -pi -e 's/\r\n/\n/g' input.file

したがって、上記の.htaccessエラーについては、次のコマンドを実行しました。

perl -pi -e 's/\r\n/\n/g' .htaccess 

フラグ-p、-i、および-e(pie)を組み合わせて、コマンドラインからPerlを使用してファイルを編集できるようにすることができます。この場合、見つかったすべての\ r \ nを\ nに置き換えます。

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