Hướng dẫn · 26/09/2026

Git LF và CRLF: Kiểm tra xuống dòng trước khi sửa hàng loạt

Bạn chỉ sửa một dòng nhưng công cụ review lại tô đỏ và xanh gần như cả file. Một khả năng cần kiểm tra là kiểu xuống dòng đã đổi giữa LF và CRLF. Đừng vội format toàn bộ repository hoặc thay cấu hình Git global: trước hết hãy xác định file nào bị ảnh hưởng và Git đang nhìn thấy gì.

Git LF và CRLF: Kiểm tra xuống dòng trước khi sửa hàng loạt

Bạn chỉ sửa một dòng nhưng công cụ review lại tô đỏ và xanh gần như cả file. Một khả năng cần kiểm tra là kiểu xuống dòng đã đổi giữa LF và CRLF. Đừng vội format toàn bộ repository hoặc thay cấu hình Git global: trước hết hãy xác định file nào bị ảnh hưởng và Git đang nhìn thấy gì.

1. Phân biệt nội dung với cách kết thúc dòng

LF và CRLF là hai cách biểu diễn kết thúc dòng. Chữ hiển thị có thể giống nhau trong editor nhưng byte lưu trên đĩa khác nhau. Đây không phải cùng vấn đề với UTF-8, dấu tiếng Việt hay việc có dòng trống cuối file.

Ví dụ một shell script cần chạy trên Linux bị lưu lại với CRLF sau khi chỉnh trên Windows. Việc mở trong editor vẫn đẹp không đủ kết luận file phù hợp môi trường chạy. Hãy bắt đầu từ file cụ thể thay vì suy đoán toàn bộ dự án.

2. Đọc thông tin index và working tree

git status --short
git ls-files --eol -- scripts/check.sh

Thay scripts/check.sh bằng đường dẫn file đã được Git theo dõi. Theo tài liệu git ls-files, --eol hiển thị thông tin kết thúc dòng trong index, working tree và thuộc tính liên quan.

i/lf    w/crlf    attr/text eol=crlf    scripts/check.sh

Dòng trên là ví dụ minh họa, không phải kết quả kiểm tra repository của bạn. i/lf nói bản trong index dùng LF; w/crlf nói bản đang làm việc dùng CRLF. Hai cột khác nhau có thể là kết quả chuyển đổi có chủ đích, không tự chứng minh dữ liệu hỏng. mixed cho biết có kiểu kết thúc dòng trộn lẫn.

3. Kiểm tra thuộc tính đang áp dụng

git check-attr text eol -- scripts/check.sh
git check-attr --cached text eol -- scripts/check.sh

git check-attr cho biết giá trị thuộc tính của đường dẫn. --cached dùng .gitattributes trong index thay cho working tree. So sánh hai kết quả hữu ích khi file quy tắc đang được sửa nhưng chưa stage.

Kết quả unspecified không có nghĩa file không có xuống dòng; nó nói thuộc tính đó chưa được xác định qua cơ chế đang kiểm tra. Lúc này cần xem thêm cấu hình Git và thiết lập editor, không tự suy ra một quy tắc LF hay CRLF.

4. Đọc cấu hình trước khi đổi cấu hình

git config --show-origin --get-all core.autocrlf
git config --show-origin --get-all core.eol

Các lệnh này giúp xác định giá trị và file cấu hình cung cấp nó. Không có output có thể chỉ là không có khai báo tường minh; đừng coi đó là lỗi cần sửa bằng một giá trị global tùy ý.

Nếu nhóm thống nhất quy tắc trong .gitattributes, hãy review thay đổi quy tắc cùng phạm vi file ảnh hưởng. Không giả định chỉ thêm file quy tắc là mọi nội dung đã theo dõi được chuẩn hóa ngay. Việc chuẩn hóa là một thay đổi riêng cần bảo vệ công việc hiện tại và đọc lại staged diff.

5. Giữ việc sửa có phạm vi rõ ràng

Trước khi chuyển đổi, xác nhận đây là file văn bản và kiểu xuống dòng mà công cụ sử dụng yêu cầu. Không chạy bộ chuyển đổi văn bản lên ảnh, tệp nén hoặc dữ liệu nhị phân. Với file sinh tự động, sửa nguồn hoặc cấu hình generator để lỗi không quay lại ở lần sinh sau.

Nếu cần chuẩn hóa nhiều file, nên tách khỏi bản sửa tính năng. Một commit vừa đổi hàng nghìn dòng định dạng vừa sửa logic sẽ khó review và khó tìm nguyên nhân khi có hồi quy.

  • Đã xác định đúng file và phân biệt index với working tree.
  • Đã xem thuộc tính, cấu hình Git và thiết lập editor.
  • Không bỏ qua thay đổi người khác đang làm.
  • Chỉ chuyển đổi file văn bản trong phạm vi được thống nhất.
  • Đọc lại diff và chạy kiểm thử trên môi trường sử dụng thực tế.

Tất cả lệnh trong bài là bước quan sát, không tự đổi kiểu xuống dòng. Khi hiểu rõ nguồn của khác biệt, bạn có thể chọn cách sửa nhỏ và kiểm chứng được thay vì làm sạch hàng loạt theo cảm tính.

Thảo luận

Bình luận 0

Đăng nhập để bình luận

Bạn cần có tài khoản để tham gia thảo luận và trả lời độc giả khác.

Đăng nhậpĐăng ký

Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.