--- CẬP NHẬT 3 --- (không xung đột với CẬP NHẬT 2)
Xem xét trường hợp người dùng windows thích làm việc trên CRLF
và người dùng linux / mac thích làm việc trên LF
các tệp văn bản. Cung cấp câu trả lời từ quan điểm của một người duy trì kho lưu trữ :
Đối với tôi, chiến lược tốt nhất (những vấn đề ít hơn để giải quyết) là: giữ tất cả các file văn bản với LF
repo git bên ngay cả khi bạn đang làm việc trên một dự án cửa sổ-chỉ. Sau đó, cho phép khách hàng tự do làm việc theo kiểu kết thúc dòng theo sở thích của họ , miễn là họ chọn một core.autocrlf
giá trị thuộc tính sẽ tôn trọng chiến lược của bạn (LF trên repo) trong khi sắp xếp các tệp để cam kết.
Dàn dựng là điều mà nhiều người nhầm lẫn khi cố gắng hiểu cách các chiến lược dòng mới hoạt động. Điều cần thiết là hủy bỏ các điểm sau đây trước khi chọn giá trị chính xác cho thuộc core.autocrlf
tính:
- Thêm một tệp văn bản cho cam kết ( dàn nó) giống như sao chép tệp vào một nơi khác trong
.git/
thư mục con với các kết thúc dòng được chuyển đổi (tùy thuộc vào core.autocrlf
giá trị trên cấu hình máy khách của bạn). Tất cả điều này được thực hiện tại địa phương.
- cài đặt
core.autocrlf
giống như cung cấp câu trả lời cho câu hỏi (chính xác cùng một câu hỏi trên tất cả các hệ điều hành):
- "Git-client a. Chuyển đổi LF-thành-CRLF khi thanh toán (kéo) thay đổi repo từ xa hoặc b. Chuyển đổi CRLF-thành-LF khi thêm tệp cho cam kết? " Và các câu trả lời có thể có (giá trị) Chúng tôi:
false:
" không làm gì ở trên ",
input:
" chỉ làm b "
true
: " làm a và b "
- lưu ý rằng KHÔNG CÓ " chỉ làm một "
May mắn thay
- git client mặc định (windows :
core.autocrlf: true
, linux / mac
core.autocrlf: false
:) sẽ tương thích với chiến lược chỉ có repo của LF .
Ý nghĩa : các máy khách windows theo mặc định sẽ chuyển đổi thành CRLF khi kiểm tra kho lưu trữ và chuyển đổi thành LF khi thêm xác nhận. Và các máy khách linux sẽ mặc định không thực hiện bất kỳ chuyển đổi nào. Về lý thuyết này giữ repo của bạn chỉ lf.
Không may:
- Có thể có các máy khách GUI không tôn trọng
core.autocrlf
giá trị git
- Có thể có những người không sử dụng giá trị để tôn trọng chiến lược lf-repo của bạn. Ví dụ, họ sử dụng
core.autocrlf=false
và thêm một tệp với CRLF để xác nhận.
Để phát hiện các tệp văn bản không phải lf ASAP được cam kết bởi các máy khách ở trên, bạn có thể làm theo những gì được mô tả trên --- update 2 ---: ( git grep -I --files-with-matches --perl-regexp '\r' HEAD
, trên một máy khách được biên dịch bằng cách sử dụng: --with-libpcre
flag)
Và đây là cái bẫy : . Tôi với tư cách là người duy trì repo giữ git.autocrlf=input
để tôi có thể sửa bất kỳ tệp cam kết sai nào chỉ bằng cách thêm chúng một lần nữa cho cam kết. Và tôi cung cấp một văn bản cam kết: "Sửa các tệp cam kết sai".
Theo như .gitattributes
được học hỏi. Tôi không tin vào điều đó, vì có nhiều khách hàng ui không hiểu nó. Tôi chỉ sử dụng nó để cung cấp gợi ý cho các tệp văn bản và tệp nhị phân và có thể gắn cờ một số tệp đặc biệt mà mọi nơi sẽ giữ cùng một kết thúc dòng:
*.java text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg -text # Don't do auto-detection. Treat as binary
*.sh text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat text eol=crlf # Treat as text. Checkout and add with eol=crlf
Câu hỏi: Nhưng tại sao chúng ta quan tâm đến tất cả trong chiến lược xử lý dòng mới?
Trả lời: Để tránh một cam kết thay đổi một chữ cái, hãy xuất hiện dưới dạng thay đổi 5000 dòng , chỉ vì ứng dụng khách thực hiện thay đổi tự động chuyển đổi toàn bộ tệp từ crlf sang lf (hoặc ngược lại) trước khi thêm cam kết. Điều này có thể khá đau đớn khi có một giải quyết xung đột liên quan. Hoặc trong một số trường hợp, nó có thể là nguyên nhân của những xung đột không hợp lý.
--- CẬP NHẬT 2 ---
Các dahaults của git client sẽ hoạt động trong hầu hết các trường hợp. Ngay cả khi bạn chỉ có windows chỉ có máy khách, linux chỉ có máy khách hoặc cả hai. Đó là:
- windows:
core.autocrlf=true
có nghĩa là chuyển đổi dòng thành CRLF khi thanh toán và chuyển đổi dòng thành LF khi thêm tệp.
- linux:
core.autocrlf=input
có nghĩa là không chuyển đổi các dòng khi thanh toán (không cần thiết vì các tệp dự kiến sẽ được cam kết với LF) và chuyển đổi các dòng thành LF (nếu cần) khi thêm tệp. ( - update3 - : Có vẻ như đây là false
mặc định, nhưng một lần nữa nó vẫn ổn)
Các tài sản có thể được thiết lập trong phạm vi khác nhau. Tôi sẽ đề nghị thiết lập rõ ràng trong --global
phạm vi, để tránh một số vấn đề IDE được mô tả ở cuối.
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
Ngoài ra, tôi sẽ không khuyến khích sử dụng trên các cửa sổ git config --global core.autocrlf false
(trong trường hợp bạn chỉ có các máy khách của windows) trái ngược với những gì được đề xuất cho tài liệu git . Đặt thành false sẽ cam kết các tệp với CRLF trong repo. Nhưng thực sự không có lý do. Bạn không bao giờ biết liệu bạn sẽ cần chia sẻ dự án với người dùng linux hay không. Thêm vào đó là thêm một bước cho mỗi khách hàng tham gia dự án thay vì sử dụng mặc định.
Bây giờ đối với một số trường hợp đặc biệt của các tệp (ví dụ *.bat
*.sh
) mà bạn muốn chúng được kiểm tra bằng LF hoặc với CRLF, bạn có thể sử dụng.gitattributes
Tóm lại cho tôi cách thực hành tốt nhất là:
- Đảm bảo rằng mọi tệp không nhị phân được cam kết với LF trên git repo (hành vi mặc định).
- Sử dụng lệnh này để đảm bảo rằng không có tập tin được cam kết với CRLF:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Lưu ý: trên cửa sổ khách hàng chỉ hoạt động thông qua git-bash
và về khách hàng linux chỉ khi biên soạn sử dụng --with-libpcre
trong ./configure
).
- Nếu bạn tìm thấy bất kỳ tệp nào như vậy bằng cách thực hiện lệnh trên, hãy sửa chúng. Điều này liên quan (ít nhất là trên linux):
- thiết lập
core.autocrlf=input
( --- cập nhật 3 - )
- thay đổi tập tin
- hoàn nguyên thay đổi (tập tin vẫn được hiển thị là đã thay đổi)
- cam kết nó
- Chỉ sử dụng mức tối thiểu
.gitattributes
- Hướng dẫn người dùng đặt các
core.autocrlf
mô tả ở trên về các giá trị mặc định của nó.
- Không được tính 100% vào sự hiện diện của
.gitattributes
. git-client của IDE có thể bỏ qua chúng hoặc đối xử với chúng khác nhau.
Như đã nói một số điều có thể được thêm vào trong các thuộc tính git:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
Tôi nghĩ rằng một số tùy chọn an toàn khác .gitattributes
thay vì sử dụng tự động phát hiện cho các tệp nhị phân:
-text
(ví dụ: cho *.zip
hoặc *.jpg
tệp: Sẽ không được coi là văn bản. Do đó, sẽ không có chuyển đổi kết thúc dòng nào được thực hiện. Có thể có thể khác nhau thông qua các chương trình chuyển đổi)
text !eol
(ví dụ như cho *.java
, *.html
:.. Bị đối xử như văn bản, nhưng sở thích phong cách eol không được thiết lập Vì vậy, thiết lập khách hàng được sử dụng)
-text -diff -merge
(ví dụ *.hugefile
: Không được coi là văn bản. Không thể tìm khác biệt / hợp nhất)
--- CẬP NHẬT TRƯỚC ---
Một ví dụ đau lòng về một khách hàng sẽ cam kết các tệp sai:
netbeans 8.2 (trên windows), sẽ cam kết sai tất cả các tệp văn bản với CRLF, trừ khi bạn đã đặt rõ ràng core.autocrlf
là toàn cục . Điều này mâu thuẫn với hành vi của khách hàng git tiêu chuẩn và gây ra nhiều vấn đề sau này, trong khi cập nhật / hợp nhất. Đây là những gì làm cho một số tệp xuất hiện khác nhau (mặc dù chúng không) ngay cả khi bạn hoàn nguyên .
Hành vi tương tự trong netbeans xảy ra ngay cả khi bạn đã thêm chính xác .gitattributes
vào dự án của mình.
Sử dụng lệnh sau sau khi xác nhận, ít nhất sẽ giúp bạn phát hiện sớm xem liệu git repo của bạn có vấn đề kết thúc dòng hay không: git grep -I --files-with-matches --perl-regexp '\r' HEAD
Tôi đã dành hàng giờ để đưa ra cách sử dụng tốt nhất có thể .gitattributes
, cuối cùng nhận ra rằng tôi không thể tin vào điều đó.
Thật không may, miễn là các trình soạn thảo dựa trên JGit tồn tại (không thể xử lý .gitattributes
chính xác), giải pháp an toàn là buộc LF ở mọi nơi ngay cả ở cấp độ biên tập viên.
Sử dụng các anti-CRLF
chất khử trùng sau đây .
.gitattributes
?