Windows git Cảnh báo: LF sẽ được thay thế bằng CRLF, đó có phải là đuôi cảnh báo lạc hậu không?


147

env:

  • Windows 7
  • msysgit

Khi tôi git commit, nó nói:

warning: LF will be replaced by CRLF. 

Đây có phải là đuôi cảnh báo lạc hậu?
Tôi chỉnh sửa tệp trong Windows, cuối dòng là CRLF, giống như pic này:
nhập mô tả hình ảnh ở đây
Và git thay đổi nó để LFcam kết repo.
Vì vậy, tôi nghĩ rằng cảnh báo chính xác là:

warning: CRLF will be replaced by LF. 


2
@devnull Ý tôi là cảnh báo là đuôi lạc hậu phải không?
Honghe.Wu

@ Honghe.Wu Không, nó không có trên Windows. Tôi đã chỉnh sửa câu trả lời của mình bên dưới
VonC

11
Câu hỏi tuyệt vời bởi vì thực sự, cảnh báo dường như là lạc hậu. Thật khó hiểu khi nhận được cảnh báo này về việc chuyển đổi sang CRLF trên một cam kết và không có giải thích nào về việc xử lý khoảng trắng của Git sẽ giúp ích, bởi vì cảnh báo là ngược .
Stijn de Witt

1
@StijndeWitt Tôi rất thích xem bạn nhận xét như một câu trả lời để nâng cao nó.
user1460043

Câu trả lời:


185

cảnh báo: LF sẽ được thay thế bằng CRLF.

Tùy thuộc vào trình chỉnh sửa bạn đang sử dụng, một tệp văn bản với LF sẽ không cần thiết được lưu bằng CRLF: các trình chỉnh sửa gần đây có thể duy trì kiểu eol. Nhưng cài đặt cấu hình git đó khăng khăng thay đổi những ...

Chỉ cần đảm bảo rằng (như tôi khuyên ở đây ):

git config --global core.autocrlf false

Bằng cách đó, bạn tránh mọi chuyển đổi tự động và vẫn có thể chỉ định chúng thông qua .gitattributestệpcore.eolchỉ thị .


windows git "LF sẽ được thay thế bằng CRLF"
Đây có phải là đuôi cảnh báo không?

Không: bạn đang ở trên Windows và git configtrang trợ giúp có đề cập đến

Sử dụng cài đặt này nếu bạn muốn có CRLFkết thúc dòng trong thư mục làm việc của mình mặc dù kho lưu trữ không có kết thúc dòng được chuẩn hóa.

Như được mô tả trong " git thay thế LF bằng CRLF ", nó chỉ xảy ra khi thanh toán (không phải cam kết), với core.autocrlf=true.

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

Như đã đề cập trong câu trả lời của XiaoPeng , cảnh báo đó giống như:

cảnh báo: (Nếu bạn kiểm tra nó / hoặc sao chép vào thư mục khác với core.autocrlfcấu hình hiện tại của bạn ,) LF sẽ được thay thế bằng CRLF
Tệp sẽ có kết thúc dòng gốc trong thư mục làm việc (hiện tại) của bạn.

Như đã đề cập trong git-for-windows/gitsố 1242 :

Tôi vẫn cảm thấy tin nhắn này khó hiểu, tin nhắn có thể được mở rộng để bao gồm một lời giải thích tốt hơn về vấn đề này, ví dụ: "LF sẽ được thay thế bằng CRLF file.jsonsau khi xóa tệp và kiểm tra lại".

Lưu ý: Git 2.19 (Tháng 9 năm 2018), khi sử dụng core.autocrlf, cảnh báo "LF sẽ bị thay thế bởi CRLF" hiện bị loại bỏ .


Như quaylar bình luận đúng , nếu có một chuyển đổi trên cam kết, nó là LFchỉ.

Cảnh báo cụ thể đó " LF will be replaced by CRLF" đến từ convert.c # check_safe_crlf () :

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

Nó được gọi bởi convert.c#crlf_to_git(), chính nó được gọi bởi convert.c#convert_to_git(), chính nó được gọi bởi convert.c#renormalize_buffer().

Và cuối cùng renormalize_buffer()chỉ được gọi bởi merge-recursive.c#blob_unchanged().

Vì vậy, tôi nghi ngờ việc chuyển đổi này chỉ xảy ra git commitnếu cam kết là một phần của quy trình hợp nhất.


Lưu ý: với Git 2.17 (quý 2 năm 2018), việc dọn mã sẽ thêm một số giải thích.

Xem cam kết 8462ff4 (ngày 13 tháng 1 năm 2018) của Torsten Bögershausen ( tboegi) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 9bc89b1 , ngày 13 tháng 2 năm 2018)

convert_to_git (): safe_crlf / checksafe trở thành int conv_flags

Khi gọi convert_to_git(), checksafetham số đã xác định điều gì sẽ xảy ra nếu chuyển đổi EOL ( CRLF --> LF --> CRLF) không làm tròn một cách sạch sẽ.
Ngoài ra, nó cũng được xác định nếu kết thúc dòng nên được tái chuẩn hóa ( CRLF --> LF) hoặc giữ nguyên như vậy.

checksafe là một safe_crlfenum với các giá trị sau:

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Lưu ý rằng hồi quy được giới thiệu trong 8462ff4 (" convert_to_git(): safe_crlf/checksafetrở thành int conv_flags", 2018-01-13, Git 2.17.0) trở lại trong chu kỳ Git 2.17 khiến việc autocrlfviết lại tạo ra thông báo cảnh báo mặc dù đã cài đặtsafecrlf=false .

Xem cam kết 6cb0912 (04 tháng 6 năm 2018) của Anthony Sottile ( asottile) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 8063ff9 , ngày 28 tháng 6 năm 2018)


1
Có, hầu hết các trình soạn thảo có thể duy trì kiểu EOL, nhưng với hầu hết các trình soạn thảo, điều đó không có tác dụng khi tạo một tệp mới trong cùng một dự án. Hãy chắc chắn rằng bạn không kiểm tra một dự án LF, nghĩ rằng "psh, trình soạn thảo của tôi có thể xử lý các kết thúc dòng của LF, tôi không cần autocrlf", và sau đó quên đặt các tệp mới thành các kết thúc dòng LF theo cách thủ công.

15
@VonC Tôi phải thú nhận rằng tôi không nhận được nó. Git-Book tuyên bố Git có thể xử lý việc này bằng cách tự động chuyển đổi các kết thúc dòng CRLF thành LF khi bạn cam kết và ngược lại khi kiểm tra mã trên hệ thống tệp của bạn. Điều này có nghĩa là trên cam kết sẽ có một chuyển đổi sang LF và không bao giờ thành CRLF . Điều đó có nghĩa là cảnh báo được đề cập là không chính xác. Có core.autocrlf=truesẽ luôn mang trong LF trong repo, và CRLF trong IMHO cây làm việc (ngay cả dưới phi Windows). Nguồn: link
quaylar 19/214

12
"Đây có phải là đuôi cảnh báo lạc hậu không? Nó chỉ nên xảy ra khi thanh toán" Tôi đang thấy cảnh báo chính xác này về cam kết . Vì vậy, , nó là lạc hậu. Nó bị lạc hậu kích hoạt tôi tìm kiếm này. Vui mừng người khác nhận thấy nó quá! Thật khó hiểu với những người thực sự đọc những cảnh báo này để thấy nó nói rằng nó sẽ chuyển đổi thành CRLF trên một thông điệp cam kết.
Stijn de Witt

7
"Vì vậy, tôi nghi ngờ việc chuyển đổi này chỉ xảy ra trên một cam kết git nếu cam kết đó là một phần của quy trình hợp nhất." Không. Tôi đang thấy điều này trên các cam kết thường xuyên.
Stijn de Witt

3
Phần khiến tôi bực mình về thông điệp là nó hiện lên. tại sao tôi cần phải được thông báo rằng git sắp làm chính xác những gì tôi đã cấu hình nó để làm. Tôi không cần một lời cảnh báo rằng "này, chúng tôi vẫn đang chuyển đổi kết thúc dòng cho bạn, như bạn đã yêu cầu chúng tôi". Khi hệ thống hoạt động theo thiết kế, nó không nên đưa ra những cảnh báo không cần thiết hoặc mọi người bỏ lỡ những cảnh báo quan trọng trong một biển các thông điệp không liên quan.
Brent Larsen

27

cảnh báo là ngược.

Và trên thực tế, nó thậm chí không phải là một cảnh báo ở nơi đầu tiên. Bởi vì tất cả các cảnh báo này đều nói (nhưng không may ngược lại) là các ký tự CRLF trong tệp của bạn có kết thúc dòng Windows sẽ được thay thế bằng cam kết của LF. Điều đó có nghĩa là nó được chuẩn hóa thành các đầu cuối cùng dòng được sử dụng bởi * nix và MacOS.

Không có gì lạ đang xảy ra, đây chính xác là hành vi bạn thường muốn.

Cảnh báo này ở dạng hiện tại là một trong hai điều:

  1. Một lỗi đáng tiếc kết hợp với một thông báo cảnh báo quá thận trọng, hoặc
  2. Một cốt truyện rất thông minh để khiến bạn thực sự nghĩ điều này thông qua ...

;)


1
Điều kỳ lạ là nếu bạn buộc phải chuyển đổi các tệp cục bộ trên Windows sang LF, bạn thậm chí không thể thêm các tệp, thông báo sẽ phàn nàn và làm mất đi cam kết của bạn.
phpguru

24

- Cập nhật vào ngày 9 tháng 7 ---

Đã xóa "Đó là chính xác và chính xác" như nhận xét của @mgiuca

======

NO . Nó KHÔNG nói về các tập tin của bạn hiện tại với CRLF. Nó thay vì nói về các tập tin với LF.

Nó nên đọc:

cảnh báo: ( Nếu bạn kiểm tra nó / hoặc sao chép vào thư mục khác với cấu hình core.autocrlf hiện tại của bạn ,) LF sẽ được thay thế bằng CRLF

Các tập tin sẽ có kết thúc dòng ban đầu của nó trong thư mục làm việc ( hiện tại ) của bạn .

Bức ảnh này sẽ giải thích ý nghĩa của nó. nhập mô tả hình ảnh ở đây


1
Hình minh họa đẹp. +1. Tôi đã tham khảo câu trả lời của bạn trong tôi để nhìn rõ hơn.
VonC

Những gì hoạt động tốt với tôi là: 1) core.autocrlf = false 2) trong Intellij đặt Dấu tách dòng (\ n). Tôi sử dụng Intellij Idea trên cả Mac và Windows.
Xiao Peng - ZenUML.com 18/07/17

Điều này có thể xảy ra khi tệp được tạo trong Windows nhưng có dòng unix / mac kết thúc (lf) và thuộc tính git config autocrlf của bạn là đúng. Về cơ bản, git sẽ không thay đổi tệp bạn đã tạo nhưng nó sẽ kiểm tra / sao chép nó với các kết thúc dòng windows (vì cài đặt autocrlf của bạn)
Patrick

1
Làm thế nào là cảnh báo chính xác và chính xác nếu bạn phải đủ điều kiện với "Nếu bạn kiểm tra nó / hoặc sao chép vào một thư mục khác với cấu hình core.autocrlf hiện tại của bạn". Đó không phải là những gì thông điệp ban đầu nói. Nó nói rằng SILL (không có thể) được thay thế bằng CRLF, ngụ ý rằng nó sẽ được lưu trữ trong chế độ CRLF trong chính repo, chứ không phải trong một số kiểm tra giả định trong tương lai.
mgiuca

12

Tất cả điều này giả định core.autocrlf=true

Lỗi gốc:

cảnh báo: LF sẽ được thay thế bằng CRLF
Tệp sẽ có các kết thúc dòng gốc trong thư mục làm việc của bạn.

Lỗi gì NÊN đọc:

cảnh báo: LF sẽ được thay thế bằng CRLF trong thư mục làm việc của bạn
Tệp sẽ có các kết thúc dòng gốc của nó trong kho git

Giải thích tại đây :

Tác dụng phụ của việc chuyển đổi thuận tiện này và đây là điều mà cảnh báo bạn đang gặp phải là, nếu một tệp văn bản mà bạn là tác giả ban đầu có kết thúc LF thay vì CRLF, nó sẽ được lưu trữ với LF như bình thường, nhưng khi được kiểm tra ra sau nó sẽ có kết thúc CRLF. Đối với các tệp văn bản bình thường, điều này thường là tốt. Cảnh báo là "thông tin của bạn" trong trường hợp này, nhưng trong trường hợp git đánh giá không chính xác tệp nhị phân là tệp văn bản, thì đó là một cảnh báo quan trọng vì git sau đó sẽ làm hỏng tệp nhị phân của bạn.

Về cơ bản, một tệp cục bộ mà trước đây là LF sẽ có CRLF cục bộ


7

git config --global core.autocrlf false hoạt động tốt cho các thiết lập toàn cầu.

Nhưng nếu bạn đang sử dụng Visual Studio, có thể cần phải sửa đổi .gitattributescho một số loại dự án ( ví dụ: ứng dụng thư viện lớp c # ):

  • xóa dòng * text=auto

1

Sau khi tôi đặt, core.autocrlf=truetôi nhận được "LF sẽ được thay thế bằng CRLF" (lưu ý không phải "CRLF sẽ được thay thế bởi LF") khi tôi đang git add(hoặc có lẽ nó đã được git commitchỉnh sửa?) Trong các cửa sổ trên kho lưu trữ (có sử dụng không LF) đã được kiểm tra trước khi tôi thiết lập core.autocrlf=true.

Tôi đã thực hiện một kiểm tra mới với core.autocrlf=truevà bây giờ tôi không nhận được những tin nhắn đó.


0

Nếu bạn đang sử dụng Visual Studio 2017, 2019, bạn có thể:

  1. mở tệp .gitignore chính (cập nhật hoặc xóa các tệp .gitignore trong các dự án khác trong giải pháp)
  2. dán mã dưới đây:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process

1
"Mã" đó trông giống như trong tệp cấu hình như .gitconfighoặc .git/configkhông .gitignore, chỉ định các tệp bị bỏ qua bởi git.
davidA

Tôi đã thêm phần này vào .git / config nhưng vẫn "cảnh báo: CRLF sẽ được thay thế bởi LF"
Sergei

0

Chỉ làm điều đơn giản:

  1. Mở git-hub (Shell) và điều hướng đến tệp thư mục thuộc về (cd / a / b / c / ...)
  2. Thực thi dos2unix (đôi khi dos2unix.exe)
  3. Hãy thử cam kết ngay bây giờ. Nếu bạn gặp lỗi tương tự một lần nữa. Thực hiện tất cả các bước trên trừ khi thay vì dos2unix, đôi khi hãy thực hiện unix2dox (unix2dos.exe)
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.