git thay thế LF bằng CRLF


839

Chạy git trên máy Windows XP, sử dụng bash. Tôi đã xuất dự án của mình từ SVN, và sau đó nhân bản một kho lưu trữ trần.

Sau đó tôi dán xuất vào thư mục kho lưu trữ trần và thực hiện:

git add -A

Sau đó tôi nhận được một danh sách các tin nhắn nói:

LF sẽ được thay thế bằng CRLF

Sự phân nhánh của chuyển đổi này là gì? Đây là một giải pháp .NET trong Visual Studio.


14
@apphacker vì tiêu chuẩn hóa kết thúc dòng ít gây khó chịu hơn là phải tự thay đổi chúng khi phân biệt hai tệp. (Và tất nhiên, nếu bạn không đồng ý, thì bạn có thể tắt tính năng core.autocrlf).
RJFalconer

2
tại sao các kết thúc dòng sẽ khác nhau trừ khi toàn bộ dòng được chạm vào
Bjorn

3
Tôi thường chạm vào nhiều dòng, vì tôi đang thử nghiệm các ý tưởng khác nhau, thêm các câu lệnh theo dõi để xem cách chúng hoạt động, v.v. Sau đó, tôi có thể chỉ muốn thay đổi hai hoặc ba dòng và git hoàn toàn bỏ qua những người khác vì tôi đã đặt chúng trở lại theo cách mà tôi đã tìm thấy chúng (hoặc tôi nghĩ vậy).
MatrixFrog

5
@MatrixFrog: trình soạn thảo của bạn dường như bị hỏng, không thể tự động phát hiện kết thúc dòng. Đó là cái gì Tôi làm việc trên các dự án kết hợp phải có một số tệp LF và một số tệp CRLF khác trong cùng một repo. Không phải là một vấn đề cho bất kỳ biên tập viên hiện đại. Việc kiểm soát phiên bản (hoặc truyền tệp) lộn xộn với các kết thúc dòng để khắc phục các hạn chế của trình soạn thảo là ý tưởng tồi tệ nhất từ ​​trước đến nay - rõ ràng từ độ dài của các giải thích bên dưới.
MarcH

4
Trình chỉnh sửa hiện đại duy nhất tôi biết về điều đó không đúng là Visual Studio. Visual Studio sẽ vui vẻ mở một tệp có kết thúc dòng LF. Nếu sau đó bạn chèn các dòng mới, nó sẽ chèn CRLF và lưu các kết thúc dòng hỗn hợp. Microsoft từ chối sửa lỗi này, đó là một nhược điểm khá lớn đối với một IDE khá tốt khác: - (
Jon Watte 7/2/2015

Câu trả lời:


957

Các thông báo này là do giá trị mặc định không chính xác core.autocrlftrên Windows.

Khái niệm autocrlflà xử lý chuyển đổi kết thúc dòng một cách minh bạch. Và nó làm được!

Tin xấu : giá trị cần phải được cấu hình bằng tay.
Tin tốt : chỉ nên thực hiện MỘT lần cho mỗi lần cài đặt git (cũng có thể cài đặt dự án).

Làm thế nào autocrlfcác công trình :

core.autocrlf=true:      core.autocrlf=input:     core.autocrlf=false:

        repo                     repo                     repo
      ^      V                 ^      V                 ^      V
     /        \               /        \               /        \
crlf->lf    lf->crlf     crlf->lf       \             /          \      
   /            \           /            \           /            \

Ở đây crlf= điểm đánh dấu cuối dòng kiểu win, lf= unix-style (và mac osx).

(tiền osx crkhông bị ảnh hưởng cho bất kỳ ba tùy chọn nào ở trên)

Khi nào cảnh báo này hiển thị (trong Windows)

    - autocrlf= truenếu bạn có kiểu unix lftrong một trong các tệp của mình (= RARELY),
    - autocrlf= inputnếu bạn có kiểu win crlftrong một trong các tệp của mình (= gần như LUÔN),
    - autocrlf= false- KHÔNG BAO GIỜ!

Cảnh báo này có ý nghĩa gì

Cảnh báo " LF sẽ được thay thế bằng CRLF " nói rằng bạn (có autocrlf= true) sẽ mất LF kiểu unix của bạn sau chu kỳ kiểm tra cam kết (nó sẽ được thay thế bằng CRLF theo kiểu cửa sổ). Git không mong đợi bạn sử dụng kiểu dáng unix dưới cửa sổ.

Cảnh báo " CRLF sẽ được thay thế bởi LF " nói rằng bạn (có autocrlf= input) sẽ mất CRLF theo kiểu cửa sổ của bạn sau một chu kỳ kiểm tra cam kết (nó sẽ được thay thế bằng kiểu unix kiểu unix). Đừng sử dụng inputdưới cửa sổ.

Một cách khác để cho thấy cách làm autocrlfviệc

1) true:             x -> LF -> CRLF
2) input:            x -> LF -> LF
3) false:            x -> x -> x

trong đó x là CRLF (kiểu cửa sổ) hoặc LF (kiểu unix) và mũi tên là viết tắt của

file to commit -> repository -> checked out file

Làm thế nào để khắc phục

Giá trị mặc định cho core.autocrlfđược chọn trong quá trình cài đặt git và được lưu trữ trong gitconfig ( %ProgramFiles(x86)%\git\etc\gitconfig) trên toàn hệ thống . Ngoài ra còn có (xếp theo thứ tự sau):

   - gitconfig "toàn cầu" (mỗi người dùng) được đặt tại ~/.gitconfig, nhưng một gitconfig
   "toàn cầu" (trên mỗi người dùng) tại $XDG_CONFIG_HOME/git/confighoặc $HOME/.config/git/config
   - "cục bộ" (mỗi repo) gitconfig tại .git/configthư mục làm việc.

Vì vậy, hãy viết git config core.autocrlfvào thư mục làm việc để kiểm tra giá trị hiện đang sử dụng và

   - thêm autocrlf=falsevào giải pháp gitconfig # per-system trên toàn hệ thống
   - git config --global core.autocrlf false            # giải pháp cho mỗi người dùng
   - git config --local core.autocrlf false              # giải pháp cho mỗi dự án

Cảnh báo
- git configcài đặt có thể bị ghi đè bởi gitattributescài đặt.
- crlf -> lfchuyển đổi chỉ xảy ra khi thêm tệp mới, crlftệp đã tồn tại trong repo không bị ảnh hưởng.

Đạo đức (dành cho Windows):
    - use core.autocrlf= truenếu bạn dự định sử dụng dự án này trong Unix (và không muốn định cấu hình trình soạn thảo / IDE của bạn để sử dụng kết thúc dòng unix),
    - use core.autocrlf= falsenếu bạn dự định chỉ sử dụng dự án này trong Windows ( hoặc bạn đã định cấu hình trình soạn thảo / IDE của mình để sử dụng các kết thúc dòng unix),
    - không bao giờ sử dụng core.autocrlf= inputtrừ khi bạn có lý do chính đáng ( ví dụ: nếu bạn đang sử dụng các tiện ích unix dưới cửa sổ hoặc nếu bạn gặp phải các vấn đề về makefiles),

PS Chọn gì khi cài đặt git cho Windows?
Nếu bạn sẽ không sử dụng bất kỳ dự án nào trong Unix, đừng đồng ý với tùy chọn đầu tiên mặc định. Chọn cái thứ ba ( Thanh toán nguyên trạng, cam kết nguyên trạng ). Bạn sẽ không thấy tin nhắn này. Không bao giờ.

PPS Sở thích cá nhân của tôi là cấu hình trình soạn thảo / IDE để sử dụng các kết thúc kiểu Unix và cài đặt core.autocrlfthành false.


28
Trong khoảng thời gian tôi đã dành để đi xa đến mức này, tôi đã hy vọng vào core.crlf = rackoff ;-)
PandaWood

10
Tôi đã cấu trúc lại nội dung, có thể sẽ dễ đọc hơn theo cách này
Antony Hatchkins

7
xin lỗi, tôi hy vọng bình luận của tôi không bị coi là một lời chỉ trích câu trả lời của bạn. Ý tôi là "để đạt được điều này" trước khi tìm thấy câu trả lời này.
PandaWood

10
Điều này thật khó hiểu. Tôi đã cài đặt trong trình soạn thảo của mình. Tất cả các mã repo sử dụng LF. autocrlf toàn cầu được đặt thành false và gitconfig lõi trong thư mục nhà của tôi được đặt thành false. Nhưng tôi vẫn nhận được thông báo LF được thay thế bằng CRLF
isimmons

17
Nếu bạn đã cấu hình trình soạn thảo của mình để sử dụng các kết thúc kiểu Unix, tại sao không đặt core.autocrlfthành đầu vào? Từ những gì tôi thu thập được từ câu trả lời của bạn, đặt nó thành đầu vào, đảm bảo kho lưu trữ và thư mục làm việc luôn có các kết thúc dòng kiểu unix. Tại sao bạn không bao giờ muốn điều đó trong Windows?
Hubro

764

Git có ba chế độ xử lý kết thúc dòng:

$ git config core.autocrlf
# that command will print "true" or "false" or "input"

Bạn có thể đặt chế độ để sử dụng bằng cách thêm một tham số bổ sung truehoặc falsevào dòng lệnh trên.

Nếu core.autocrlfđược đặt thành true, điều đó có nghĩa là bất cứ khi nào bạn thêm một tệp vào repo git mà git nghĩ là một tệp văn bản, nó sẽ biến tất cả các kết thúc dòng CRLF thành chỉ trước khi lưu nó vào cam kết. Bất cứ khi nào bạn có git checkoutmột cái gì đó, tất cả các tệp văn bản sẽ tự động được kết thúc dòng LF của chúng thành các kết thúc CRLF. Điều này cho phép phát triển một dự án trên các nền tảng sử dụng các kiểu kết thúc dòng khác nhau mà không cam kết rất ồn ào vì mỗi trình soạn thảo thay đổi kiểu kết thúc dòng vì kiểu kết thúc dòng luôn luôn là LF.

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.

Nếu core.autocrlfđược đặt thành false, không có chuyển đổi kết thúc dòng nào được thực hiện, vì vậy các tệp văn bản được kiểm tra nguyên trạng. Điều này thường hoạt động tốt, miễn là tất cả các nhà phát triển của bạn đều ở trên Linux hoặc tất cả trên Windows. Nhưng theo kinh nghiệm của tôi, tôi vẫn có xu hướng nhận được các tệp văn bản với các kết thúc dòng hỗn hợp mà cuối cùng gây ra vấn đề.

Sở thích cá nhân của tôi là để cài đặt bật ON, với tư cách là nhà phát triển Windows.

Xem http://kernel.org/pub/software/scm/git/docs/git-config.html để biết thông tin cập nhật bao gồm giá trị "đầu vào".


116
Như đã nói ở đây ( stackoverflow.com/questions/1249932/ ,), tôi sẽ không đồng ý và để cài đặt đó thành TẮT (và sử dụng Notepad ++ hoặc bất kỳ trình soạn thảo nào khác có thể xử lý - và để nguyên như vậy - bất kể ký tự dòng cuối nào nó tìm thấy)
VonC

23
Tôi thích câu trả lời này và thích để autocrlf được đặt thành true. Thay vào đó, có cách nào để tự động tắt các thông báo cảnh báo không?
Krisc

12
Sẽ thật tuyệt nếu làm tăng câu trả lời được viết tốt này bằng cách so sánh với các core.eolcài đặt, có lẽ là kết hợp với .gitattributescấu hình. Tôi đã cố gắng tìm ra sự khác biệt và chồng chéo thông qua thử nghiệm, và điều đó rất khó hiểu.
seh

5
Để có giải pháp lâu dài hơn, hãy thay đổi .gitconfig thành: [core] autocrlf = false
RBZ

9
Có cách nào dễ dàng để chỉ cảnh báo không? Tôi muốn nó thành sự thật và biết rằng tôi đã đặt nó thành sự thật. Tôi không cần phải xem tất cả các cảnh báo mọi lúc ... Không sao, thực sự ...: p
UmaN

160

Nếu bạn đã kiểm tra mã, các tệp đã được lập chỉ mục. Sau khi thay đổi cài đặt git của bạn, hãy nói bằng cách chạy:

git config --global core.autocrlf input 

bạn nên làm mới các chỉ mục với

git rm --cached -r . 

và viết lại chỉ số git với

git reset --hard

https://help.github.com/articles/deals-with-line-endings/#refreshing-a-reposeective-after-changing-line-endings

Lưu ý: điều này sẽ loại bỏ các thay đổi cục bộ của bạn, xem xét việc xóa chúng trước khi bạn làm điều này.


23
Cảm ơn bạn về một cách đơn giản, đa nền tảng, rõ ràng để CỐ ĐỊNH nó, thay vì một cuộc thảo luận lớn về ý nghĩa cấu hình.
Eris

2
nếu git reset - có thể thay đổi cục bộ của tôi sẽ bị mất? tôi chỉ theo dõi tất cả các bình luận ở trên
Freddy Sidauruk

5
Có thay đổi địa phương của bạn sẽ bị mất. Tham số --hard đặt lại chỉ mục và cây làm việc để mọi thay đổi đối với các tệp được theo dõi sẽ bị loại bỏ. git-scm.com/docs/git-reset
Jacques

2
Ý nghĩa của là git rm --cached -r .gì? Tại sao git reset --hardkhông đủ?
gavenkoa

2
@gavenkoa @max Bạn cần git rm --cached -r .Nếu bạn thực hiện git reset --hardsau khi thay đổi core.autocrlfcài đặt, nó sẽ không chuyển đổi lại các kết thúc dòng. Bạn cần làm sạch chỉ số git.
wvducky

80
git config core.autocrlf false

6
đảm bảo chạy cái này bên trong kho lưu trữ gốc
Hammad Khan

23
Tôi không hiểu làm thế nào điều này có thể hữu ích. Một nửa số người yêu cầu autocrlf là đúng để nó hoạt động, nửa còn lại cần nó là false / input. Vì vậy, những gì, họ có nghĩa vụ phải ném ngẫu nhiên những câu trả lời một lần này lên tường bảng điều khiển của họ cho đến khi một cái gì đó dính và sắp xếp "hoạt động"? Điều này không hiệu quả.
Zoran Pavlovic

Tôi nhận được một lỗi "gây tử vong: không có trong thư mục git". Tôi đã cố gắng cd sang C: \ Program Files \ Git và C: \ Program Files \ Git \ bin
pixelwiz

2
@mbb cài đặt autcrlfđể falsegiải quyết vấn đề cho mọi người dùng dự án của bạn.
jpaugh

5
@pixelwiz: lệnh này chỉ thiết lập thuộc tính cho dự án (vì vậy bạn cần phải ở dưới kho git để chạy nó). Nếu bạn muốn đặt cái này trên toàn cầu, hãy sử dụng git config --global core.autocrlf falsethay thế.
Michaël Polla

49

Cả unix2dosdos2unix đều có sẵn trong windows với gitbash. Bạn có thể sử dụng lệnh sau để thực hiện chuyển đổi UNIX (LF) -> DOS (CRLF). Do đó, bạn sẽ không nhận được cảnh báo.

unix2dos filename

hoặc là

dos2unix -D filename

Nhưng, đừng chạy lệnh này trên bất kỳ tệp CRLF hiện có nào, sau đó bạn sẽ nhận được các dòng mới trống mỗi dòng thứ hai.

dos2unix -D filenamesẽ không hoạt động với mọi hệ điều hành. Vui lòng kiểm tra liên kết này để tương thích.

Nếu vì lý do nào đó bạn cần buộc lệnh thì sử dụng --force. Nếu nó nói không hợp lệ thì sử dụng -f.


8
Nó làm gì?
Salman von Abbas

1
Đây là những gì tùy chọn trợ giúp nói: `--u2d, -D thực hiện UNIX -> chuyển đổi DOS`
Larry Battle

1
@Rifat Tôi bối rối. Nhận xét của bạn nói rằng dos2unix -Dsẽ chuyển đổi kết thúc dòng windows thành kết thúc dòng linux. Không giống như chuyển đổi DOS (CRLF) -> UNIX (LF). Tuy nhiên, dos2unix -hcác trạng thái -Dsẽ thực hiện chuyển đổi UNIX (LF) -> DOS (CRLF). dos2unix Thông tin thêm: gopherproxy.meulie.net/sdf.org/0/users/pmyshkin/dos2unix
Larry Battle

1
@LarryBattle Vâng, bạn nói đúng về -D. Trên thực tế, tôi đã đăng câu trả lời khi tôi là một người dùng windows. Và, tôi đã bình luận hơn một năm sau đó khi tôi là người dùng mac: D BTW, Cảm ơn bạn đã làm rõ.
Rifat

1
Điều này làm việc cho tôi. Tôi đang sử dụng Cygwin, dường như không hỗ trợ chuyển đổi -D - nhưng có lệnh "unix2dos", hoạt động tương tự. Tôi ước tôi biết điều gì đã gây ra sự cố mặc dù - tôi có core.autocrlf = false và đó là kho lưu trữ chỉ dành cho Windows.
Richard Beier

28

Tôi nghĩ rằng câu trả lời của @ Basiloungas đã gần nhưng đã lỗi thời (ít nhất là trên Mac).

Mở tệp ~ / .gitconfig và đặt safecrlfthành false

[core]
       autocrlf = input
       safecrlf = false

Điều đó * sẽ làm cho nó bỏ qua phần cuối của dòng char rõ ràng (dù sao cũng làm việc cho tôi).


1
Nó phải là safecrlf(với một 'f')
alpipego

22

Một bài viết của GitHub về kết thúc dòng thường được đề cập khi nói về chủ đề này.

Trải nghiệm cá nhân của tôi với việc sử dụng core.autocrlfcài đặt cấu hình thường được đề xuất là rất hỗn hợp.

Tôi đang sử dụng Windows với Cygwin, xử lý cả các dự án Windows và UNIX vào các thời điểm khác nhau. Ngay cả các dự án Windows của tôi đôi khi cũng sử dụng bashcác tập lệnh shell, yêu cầu kết thúc dòng UNIX (LF).

Sử dụng core.autocrlfcài đặt được đề xuất của GitHub cho Windows, nếu tôi kiểm tra một dự án UNIX (hoạt động hoàn hảo trên Cygwin - hoặc có thể tôi đang đóng góp cho dự án mà tôi sử dụng trên máy chủ Linux của mình), các tệp văn bản được kiểm tra bằng Windows (CRLF ) kết thúc dòng, tạo ra vấn đề.

Về cơ bản, đối với một môi trường hỗn hợp như tôi có, đặt toàn cầu core.autocrlfthành bất kỳ tùy chọn nào sẽ không hoạt động tốt trong một số trường hợp. Tùy chọn này có thể được đặt trên cấu hình git (kho lưu trữ) cục bộ, nhưng ngay cả điều đó sẽ không đủ tốt cho một dự án chứa cả nội dung liên quan đến Windows và UNIX (ví dụ: tôi có một dự án Windows với một số bashtập lệnh tiện ích).

Sự lựa chọn tốt nhất mà tôi đã tìm thấy là tạo các tệp .gitattribut trên mỗi kho lưu trữ . Các bài viết GitHub đề cập đến nó.
Ví dụ từ bài viết đó:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

Trong một kho lưu trữ của dự án của tôi:

* text=auto

*.txt         text eol=lf
*.xml         text eol=lf
*.json        text eol=lf
*.properties  text eol=lf
*.conf        text eol=lf

*.awk  text eol=lf
*.sed  text eol=lf
*.sh   text eol=lf

*.png  binary
*.jpg  binary

*.p12  binary

Có thêm một chút thứ để thiết lập, nhưng hãy thực hiện một lần cho mỗi dự án và bất kỳ người đóng góp nào trên bất kỳ HĐH nào cũng không gặp rắc rối với kết thúc dòng khi làm việc với dự án này.


Chạy vào đây, cố gắng quản lý một repo với các tập lệnh Cygwin trong số các tệp văn bản cơ bản khác. Làm thế nào bạn có thể xử lý các tệp không có phần mở rộng (ví dụ "fstab", "sshd_config")? Bài viết được liên kết không bao gồm kịch bản đó.
Mike Loux

1
@MikeLoux Hãy thử phương pháp này: stackoverflow.com/a/44806034/4377192
Gene Pavlovsky

Tôi thấy rằng text=false eol=falselàm việc hơi giống với binary. Nghe có đúng không? Có thể hữu ích khi cho biết "Tôi biết đây là các tệp văn bản, nhưng tôi không muốn chúng được chuẩn hóa"
joeytwiddle

19

Trong vim mở tệp (ví dụ :e YOURFILEENTER:), sau đó

:set noendofline binary
:wq

2
Chỉ cần chỉnh sửa với vimsẽ để lại tất cả các dòng kết thúc nguyên vẹn.
Mắt

Tôi đã gặp vấn đề này với một số tệp Cocoapods. Trên đây cố định hầu hết trong số họ; đối với phần còn lại, s / {control-v} {control-m} // đã thực hiện thủ thuật. Hai mã điều khiển cùng nhau tạo ra ^ M mà những người trong chúng ta trên OS X thường thấy trong các tệp Windows.
janineanne

16

Tôi cũng có vấn đề này.

SVN không thực hiện bất kỳ chuyển đổi kết thúc dòng nào, vì vậy các tệp được cam kết với các kết thúc dòng CRLF còn nguyên vẹn. Nếu sau đó bạn sử dụng git-svn để đưa dự án vào git thì các kết thúc CRLF vẫn tồn tại trong kho git, đây không phải là trạng thái mà git mong muốn tìm thấy - mặc định chỉ có các kết thúc dòng unix / linux (LF) đi vào.

Sau đó, khi bạn kiểm tra các tệp trên windows, chuyển đổi autocrlf sẽ giữ nguyên các tệp (vì chúng đã có kết thúc chính xác cho nền tảng hiện tại), tuy nhiên quá trình quyết định xem có sự khác biệt nào với các tệp được kiểm tra thực hiện chuyển đổi ngược lại không trước khi so sánh, dẫn đến việc so sánh những gì nó nghĩ là một tệp trong tệp đã kiểm tra với một CRLF bất ngờ trong kho lưu trữ.

Theo như tôi có thể thấy sự lựa chọn của bạn là:

  1. Nhập lại mã của bạn vào kho lưu trữ git mới mà không sử dụng git-svn, điều này có nghĩa là các kết thúc dòng được chuyển đổi trong cam kết git nội bộ --all
  2. Đặt autocrlf thành false và bỏ qua thực tế là các kết thúc dòng không theo kiểu ưa thích của git
  3. Kiểm tra các tệp của bạn với autocrlf tắt, sửa tất cả các kết thúc dòng, kiểm tra lại mọi thứ và bật lại.
  4. Viết lại lịch sử kho lưu trữ của bạn để cam kết ban đầu không còn chứa CRLF mà git không mong đợi. (Thông báo trước về việc viết lại lịch sử được áp dụng)

Lưu ý: nếu bạn chọn tùy chọn # 2 thì kinh nghiệm của tôi là một số công cụ phụ trợ (rebase, patch, v.v.) không đối phó với các tệp CRLF và bạn sẽ sớm kết thúc với các tệp có kết hợp CRLF và LF (dòng không nhất quán kết thúc). Tôi biết không có cách nào để có được tốt nhất của cả hai.


2
Tôi nghĩ rằng có một tùy chọn thứ 4 để thêm vào danh sách của bạn, giả sử người ta có thể đủ khả năng viết lại lịch sử: Bạn có thể lấy một repo git mà bạn đã tạo ban đầu bằng git-svn và viết lại lịch sử của nó để không còn các dòng CRLF nữa. Điều này sẽ cung cấp cho bạn các nguồn cấp dữ liệu được chuẩn hóa kéo dài về phía sau trong toàn bộ lịch sử svn của bạn. Người dùng keo trình bày một giải pháp tại stackoverflow.com/a/1060828/64257 .
Chris

Về chú thích của bạn: rebasekhông có vấn đề gì với CRLF. Vấn đề duy nhất tôi biết là công cụ hợp nhất git tiêu chuẩn sẽ chèn các dấu xung đột của nó ("<<<<<<", ">>>>>>" v.v.) chỉ với LF, vì vậy một tệp có dấu xung đột sẽ có kết thúc dòng hỗn hợp. Tuy nhiên, một khi bạn loại bỏ các điểm đánh dấu, mọi thứ đều ổn.
sleske

Có thể cách xử lý của git đã thay đổi trong 3 năm qua, đây là kinh nghiệm trực tiếp của tôi với nó vào thời điểm đó, tôi không cần phải xem lại vấn đề đặc biệt này kể từ đó. ymmv.
Tim Abell

1
@sleske bắt đầu git 2.8, các dấu hợp nhất sẽ không còn giới thiệu kết thúc dòng hỗn hợp. Xem stackoverflow.com/a/35474954/6309
VonC

@VonC: Thật tuyệt. Thật tốt khi biết những lúc tôi cần làm việc trên Windows.
sleske

12

Xóa phần bên dưới khỏi tệp ~ / .gitattribut

* text=auto

sẽ ngăn git kiểm tra kết thúc dòng ở vị trí đầu tiên.


6
Sai. Dòng đó, nếu có, sẽ ghi đè cấu hình của core.autocrlf. Nếu điều đó được đặt thành 'true', thì không, việc xóa dòng đó sẽ không ngăn git kiểm tra các kết thúc dòng.
Arafangion

1
Tuy nhiên, nếu core.autocrlf được đặt thành false, nếu cái này không bị xóa thì cài đặt autocrlf thành false sẽ không giúp được gì nhiều, vì vậy cái này đã giúp tôi (nhưng tự nó không đủ).
Matty

2
Nâng cao điều này !! Mặc dù phần "sẽ ngăn git kiểm tra" về mặt kỹ thuật không chính xác, đây là câu trả lời DUY NHẤT đề cập cụ thể đến text=cài đặt .gitattributes(mà nếu có, SILL sẽ là một trình chặn). Vì vậy, các câu trả lời khác là không đầy đủ. Tôi đã đi các loại hạt hình cố gắng hiểu xem tại sao tác phẩm của tôi vẫn tiếp tục xuất hiện như "biến dạng" không có vấn đề bao nhiêu lần tôi đã thay đổi tôi autocrlfsafecrlfthiết lập & kiểm tra ra & xóa bộ nhớ cache git & hard reset.
jdunk

10

Nó nên đọc:

cảnh báo: ( Nếu bạn kiểm tra nó / hoặc sao chép vào một thư mục khác với core.autocrlf hiện tại của bạntrue ,) 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


Điều đó cũng có nghĩa là những gì được gửi tới Subversion (nếu bạn làm như vậy) sẽ có chuyển đổi.
jpaugh

10

http://www.rtuin.nl/2013/02/how-to-make-git-ignore-different-line-endings/

echo "* -crlf" > .gitattributes 

Thực hiện điều này trên một cam kết hoặc git riêng biệt vẫn có thể thấy toàn bộ tệp được sửa đổi khi bạn thực hiện một thay đổi duy nhất (tùy thuộc vào việc bạn đã thay đổi tùy chọn autocrlf)

Điều này thực sự làm việc. Git sẽ tôn trọng các kết thúc dòng trong các dự án kết thúc dòng hỗn hợp và không cảnh báo bạn về chúng.


2
Điều này đặc biệt hữu ích khi bạn muốn chuyển đổi giữa CRLF và LF, nhưng bạn có một vài tệp .sh phải còn nguyên. Tôi sử dụng *.sh -crlftất cả thời gian ...
MartinTeeVarga

9

Tôi không biết nhiều về git trên Windows, nhưng ...

Xuất hiện với tôi rằng git đang chuyển đổi định dạng trả về để phù hợp với định dạng của nền tảng đang chạy (Windows). CRLF là định dạng trả về mặc định trong Windows, trong khi đó, định dạng trả về mặc định cho hầu hết các hệ điều hành khác.

Rất có thể, định dạng trả về sẽ được điều chỉnh đúng khi mã được chuyển sang hệ thống khác. Tôi cũng cho rằng git đủ thông minh để giữ các tệp nhị phân nguyên vẹn thay vì cố gắng chuyển đổi các tệp LF thành CRLF, giả sử là JPEG.

Tóm lại, có lẽ bạn không cần phải băn khoăn quá nhiều về chuyển đổi này. Tuy nhiên, nếu bạn đi lưu trữ dự án của mình dưới dạng tarball, các lập trình viên đồng nghiệp có thể sẽ đánh giá cao việc có các đầu cuối dòng LF hơn là CRLF. Tùy thuộc vào mức độ bạn quan tâm (và tùy thuộc vào việc bạn không sử dụng Notepad), bạn có thể muốn đặt git để sử dụng trả về LF nếu bạn có thể :)

Phụ lục: CR là mã ASCII 13, LF là mã ASCII 10. Do đó, CRLF là hai byte, trong khi đó, LF là một.


5
Vì dường như không ai nói điều đó, CR là viết tắt của "Vận chuyển trở lại" và LF là viết tắt của "Line Feed". Như một lưu ý thứ hai, nhiều trình soạn thảo windows sẽ âm thầm thay đổi một tệp văn bản với ký tự LF biểu thị một dòng mới để thay vào đó là cặp ký tự CRLF. Người dùng của trình soạn thảo thậm chí sẽ không được cảnh báo, nhưng Git sẽ thấy sự thay đổi.
dùng2548343

7

Hãy chắc chắn rằng bạn đã cài đặt git mới nhất.
Tôi đã làm như trên git config core.autocrlf false, khi sử dụng git (phiên bản 2.7.1), nhưng nó không hoạt động.
Sau đó, nó hoạt động ngay khi nâng cấp git (từ 2.7.1 lên 2.20.1).


Tôi nghĩ rằng bạn có nghĩa là bạn đã git 2.17.1. Tôi đã có cùng một vấn đề và đã cập nhật và điều này cũng khắc phục nó. Vui mừng tôi thấy câu trả lời của bạn!
Phillip McMullen

5
  1. Mở tệp trong Notepad ++.
  2. Chuyển đến Chỉnh sửa / Chuyển đổi EOL.
  3. Nhấp vào Định dạng Windows.
  4. Lưu các tập tin.

1
Đồng thời thử sử dụng git config --global core.autocrlf falseđể ngăn Git đặt kết thúc dòng thành Unixtrên một cam kết. Theo dõi git config core.autocrlfđể kiểm tra xem nó thực sự được đặt thành false.
Contango

5

Câu hỏi của OP có liên quan đến windows và tôi không thể sử dụng những người khác mà không vào thư mục hoặc thậm chí chạy tệp trong Notepad ++ vì quản trị viên không hoạt động .. Vì vậy phải đi theo lộ trình này:

C:\Program Files (x86)\Git\etc>git config --global core.autocrlf false

3

Nhiều trình soạn thảo văn bản cho phép bạn thay đổi thành LF, xem hướng dẫn của Atom bên dưới. Đơn giản và rõ ràng.


Bấm CRLFvào dưới cùng bên phải:

nhập mô tả hình ảnh ở đây

Chọn LFtrong danh sách thả xuống trên cùng:

nhập mô tả hình ảnh ở đây


2

Trong lời nhắc shell GNU / Linux, các lệnh dos2unix & unix2dos cho phép bạn dễ dàng chuyển đổi / định dạng các tệp của mình đến từ MS Windows


2

CRLF có thể gây ra một số vấn đề trong khi sử dụng "mã" của bạn trong hai hệ điều hành khác nhau (Linux và Windows). Kịch bản python của tôi đã được viết trong container docker Linux và sau đó được đẩy bằng Windows git-bash. Nó đã cho tôi cảnh báo rằng LF sẽ được thay thế bằng CRLF. Tôi đã không cho nó nhiều suy nghĩ nhưng sau đó khi tôi bắt đầu kịch bản sau đó, nó nói /usr/bin/env: 'python\r': No such file or directory. Bây giờ là một \rnhánh cho bạn. Windows sử dụng "CR" - trả về vận chuyển - trên đầu trang '\ n' làm ký tự dòng mới - \n\r. Đó là điều bạn có thể phải xem xét.


0

Hầu hết các công cụ trong Windows chỉ chấp nhận LF trong tệp văn bản. Ví dụ: bạn có thể kiểm soát hành vi cho Visual Studio trong một tệp có tên '.editorconfig' với nội dung ví dụ sau (phần):

 indent_style = space
 indent_size = 2
 end_of_line = lf    <<====
 charset = utf-8

Chỉ Windows-Notepad ban đầu không hoạt động với LF nhưng có một số công cụ chỉnh sửa đơn giản phù hợp hơn có sẵn!

Do đó, bạn cũng nên sử dụng LF trong các tệp văn bản trong Windows. Đây là thông điệp của tôi, đề nghị stronlgy! Không có lý do để sử dụng CRLF trong windows!

(Cuộc thảo luận tương tự đang sử dụng \ in bao gồm các đường dẫn trong C / ++, đó là nhảm nhí, sử dụng #include <pathTo / myheader.h> với dấu gạch chéo!

Do đó cài đặt thích hợp cho git là

git config core.autocrlf false

Thông điệp của tôi: Hãy quên những chương trình tư duy cũ như dos2unix và unix2dos. Làm rõ trong nhóm của bạn rằng LF phù hợp để sử dụng trong Windows.

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.