git commit gặp lỗi nghiêm trọng "nghiêm trọng: CRLF sẽ được thay thế bằng LF trong"


84

Tôi đang sử dụng Ubuntu 13.10 x64 và đang thực hiện một dự án mà một số nhà phát triển đang sử dụng Windows, gần đây tôi đã thay đổi cấu hình git core.eolthành "lf" và core.autocrlfthành "input" và core.safecrlfthành "true". Kể từ đó, khi tôi cố gắng cam kết tệp vào kho lưu trữ cục bộ của mình, tôi gặp lỗi này:
fatal: CRLF would be replaced by LF in ......
Theo những gì tôi hiểu, nếu tôi đặt core.eolthành "lf" và core.autocrlfthành "đầu vào", git sẽ tự động chuyển đổi CRLF thành LF, nhưng tại sao lỗi này lại xảy ra ngoài? Làm cách nào để khắc phục sự cố này?

Cảm ơn bạn.

Câu trả lời:


220

Đây là một vấn đề kinh điển:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(hình ảnh từ bài đăng trên blog của Luis Tubes )

Cách khắc phục thông thường là tự chuyển đổi các tệp đó bằng dos2unix hoặc Swiss File Knife .

Tôi luôn muốn giữ core.autocrlflạifalse , có nghĩa là:

git config --global core.autocrlf false

Đó là thông báo lỗi thậm chí len lỏi trong git diffđầu ra: git.661346.n2.nabble.com/...
VonC

8
Tại sao git không thể thay đổi CRLF thành LF cho tôi nếu tôi đã đặt core.autocrlfthành đầu vào?
aserww106

1
@William vì bạn đang làm việc trên Linux và với các tệp đến từ Windows.
VonC

Cảm ơn bạn, @VonC, tôi đã sử dụng dos2unix để thay đổi tất cả các tệp eol, Vì vậy, khi các nhà phát triển Windows cam kết một số mã vào kho của họ, nếu tôi lấy từ kho của họ, git sẽ chuyển đổi CRLF thành LF, phải không? Máy chủ git của chúng tôi là trên Ubuntu.
aserww106

1
@William Ý tôi là bạn đã nói "Gần đây tôi đã đổi git config core.eolthành" lf"và core.autocrlfthành" input"": điều đó không thay đổi các tệp đã có ở đó. Điều đó sẽ có ảnh hưởng đến tương lai git pull. Các tệp hiện tại vẫn ở trong CRLF và nếu được sửa đổi, sẽ được chuyển đổi thành LF nếu có thể, và nếu không, sẽ kích hoạt thông báo lỗi bạn đề cập.
VonC

55

Tôi đã gặp vấn đề tương tự và đã thử giải pháp được đề xuất nhưng không thành công.

Tôi phải thực hiện lệnh thứ hai để làm cho nó hoạt động:

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

5
có bất kỳ phân nhánh tiêu cực nào cho chỉnh sửa bổ sung này không?
AlleyOOP

Cảm ơn ngài! Giúp tôi ra ngoài vào năm 2020 :)
Joe Spinelli

28
$ git config core.autocrlf false

3
Tôi không biết điều này làm gì nhưng nó hoạt động. Cảnh báo chết người biến mất và tôi không còn sợ hãi nữa.
wh1tney

Tôi đã làm điều này và bây giờ git diffthấy toàn bộ tệp của mình (1000 dòng) là xung đột. Các công cụ khác biệt chỉ thấy 3 dòng thay đổi.
Dagroom,

10

Người ta chỉ có thể thử dos2unix:

dos2unix [filename]

4

Điều này đã xảy ra với tôi trên hàng ngàn tệp. Vì vậy, tôi đã viết một kịch bản bash nhanh chóng để dos2unixsửa chữa nó cho tôi. Ai đó trên Linux hoặc Mac có thể thấy nó hữu ích.

#!/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

Về cơ bản, nó cố gắng làm git add .. Nếu lệnh không thành công, nó sẽ lấy tên của tệp không tương thích từ đầu ra lỗi. Sau đó, nó chạy dos2unixtrên tệp đó. Nó tiếp tục lặp lại quá trình này cho đến khi git add .hoạt động.

Nếu bạn chạy điều này, bạn sẽ thấy dos2unix: converting file xxx to Unix format...nhiều lần. Nếu không, nó không hoạt động, vì vậy chỉ cần nhấn ctrl+ choặc command+ cđể dừng nó.


2
Trong trường hợp có ai đó tò mò về cách tôi quản lý hàng nghìn tệp không được cam kết, đó là vì kho lưu trữ có một loạt các hình ảnh được tạo mã. Tôi đã không trì hoãn cam kết trong 3 năm hay bất cứ điều gì.
GreenRaccoon 23

1

Bạn cần thêm tất cả các tệp git statushiển thị dưới dạng đã sửa đổi:

git add file1
git add file2

Và sau đó cam kết các thay đổi của bạn:

git commit

Điều này sẽ giữ nguyên các tệp cục bộ của bạn, nhưng autocrlfchúng sẽ nằm trên kho lưu trữ từ xa.


1

Tôi phải đối mặt với cùng một rắc rối và đã sửa chữa bằng cách chỉnh sửa .gitattributesnhư bên dưới.

$ vim .gitattributes

bình luận ra 2 dòng trong .gitattributes

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

1

Tôi không chắc điều này có áp dụng cho bạn hay không nhưng tôi đã gặp lỗi này khi vô tình cố gắng thêm tất cả node_modulesvào các thay đổi theo giai đoạn. Vì vậy, thực sự .gitignoringnode_modulesvấn đề của tôi đã được giải quyết.


0

Tôi đang sử dụng máy Mac sử dụng Terminal và gặp sự cố này với tệp .htaccess mà tôi đang cố cam kết, nhận được lỗi nghiêm trọng:

fatal: CRLF would be replaced by LF in .htaccess

Tôi muốn khắc phục sự cố, giống như yêu cầu OP, không chỉ tắt cờ git, vì vậy tôi tìm thấy bài viết này cung cấp lệnh perl để khắc phục sự cố trên cơ sở mỗi tệp.

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

Vì vậy, đối với lỗi .htaccess của tôi ở trên, tôi đã chạy như sau:

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

Các cờ -p, -i và -e (pie) có thể được kết hợp để cho phép bạn chỉnh sửa tệp bằng Perl từ dòng lệnh. Trong trường hợp này, thay thế tất cả \ r \ n được tìm thấy bằng \ n.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.