Mục đích của `text = auto` trong tệp` .gitattribut` là gì?


129

Chủ yếu là .gitattributestập tin có * text=auto. Mục đích của text=autotập tin đó là gì?

Câu trả lời:


77

Từ các tài liệu :

Mỗi dòng trong .gitattributes(hoặc .git/info/attributes) tệp có dạng:

pattern attr1 attr2 ...

Vì vậy, ở đây, mẫu là *, có nghĩa là tất cả các tệp và thuộc tính là text=auto.

Không gì text=autolàm gì? Từ tài liệu:

Khi văn bản được đặt thành "tự động", đường dẫn được đánh dấu để chuẩn hóa tự động cuối dòng. Nếu Git quyết định rằng nội dung là văn bản, các kết thúc dòng của nó sẽ được chuẩn hóa thành LF khi đăng ký.

Hành vi mặc định là gì nếu nó không được kích hoạt?

Không xác định

Nếu thuộc tính văn bản không được chỉ định, Git sử dụng biến cấu hình core.autocrlf để xác định xem tệp có nên được chuyển đổi không.

Không gì core.autocrlflàm gì? Từ các tài liệu:

   core.autocrlf

Đặt biến này thành "true" gần giống như đặt thuộc tính văn bản thành "tự động" trên tất cả các tệp ngoại trừ các tệp văn bản không được đảm bảo để được chuẩn hóa: các tệp có chứa CRLF trong kho lưu trữ sẽ không bị chạm. Sử dụng cài đặt này nếu bạn muốn có các kết thúc dòng CRLF trong thư mục làm việc của mình mặc dù kho lưu trữ không có các kết thúc dòng được chuẩn hóa. Biến này có thể được đặt thành đầu vào, trong trường hợp đó không có chuyển đổi đầu ra nào được thực hiện.

Nếu bạn nghĩ tất cả rõ ràng như bùn, bạn không đơn độc.

Đây là những gì * text=autotôi nói: khi ai đó thực hiện một tệp, Git đoán xem tệp đó có phải là tệp văn bản hay không và nếu có, nó sẽ cam kết một phiên bản của tệp trong đó tất cả các byte CR + LF được thay thế bằng các byte LF. Nó không ảnh hưởng trực tiếp đến các tệp trông như thế nào trong cây làm việc, có các cài đặt khác sẽ chuyển đổi byte byte thành byte CR + LF khi kiểm tra tệp.

Sự giới thiệu:

Tôi không khuyên bạn nên đưa * text=autovào .gitattributestập tin. Thay vào đó, tôi muốn giới thiệu một cái gì đó như thế này:

*.txt text
*.html text
*.css text
*.js text

Điều này chỉ định rõ ràng tệp nào là tệp văn bản, được chuyển đổi CRLF thành LF trong cơ sở dữ liệu đối tượng (nhưng không nhất thiết phải trong cây làm việc). Chúng tôi đã có một repo với * text=auto, và Git đã đoán sai cho một tệp hình ảnh rằng đó là một tệp văn bản, khiến nó bị hỏng khi nó thay thế các byte CR + LF bằng các byte LF trong cơ sở dữ liệu đối tượng. Đó không phải là một trò vui để gỡ lỗi.

Nếu bạn phải sử dụng * text=auto, hãy đặt nó làm dòng đầu tiên .gitattributes, để các dòng sau có thể ghi đè lên nó. Điều này dường như đang trở thành một thực tế ngày càng phổ biến.


2
Tại sao mọi người gọi LF là Bình thường mà không phải CRLF? Có bất kỳ ref để chứng minh điều đó?
Yousha Aleayoub

1
@YoushaAleayoub Ý bạn là gì?
Flimm

1
@YoushaAleayoub nếu bạn everyoneđề cập đến git-scm, có lẽ vì họ đang phát triển gói * nix và do đó sử dụng ký tự dòng * nix là bình thường .
Justin Moh

4
@YoushaAleayoub LF được coi là b / c "bình thường", nó phổ biến trong nhiều công cụ dev. Các công cụ dev phổ biến như git-scmđến từ * nix. MacOS sử dụng LF. Chỉ Windows (chỉ xem xét các hệ điều hành luồng chính) đang sử dụng CRLF. Điều này làm cho các nhà phát triển sử dụng các công cụ * nix trên Windows và mọi người khi trao đổi tệp khó khăn hơn. Xem thêm Tại sao CRLF .
Roi Danton

2
@Flimm, bạn có thể giải thích sự khác biệt giữa *.txt text=auto*.txt textxin vui lòng? Tôi nghĩ rằng tất cả 4 dòng trong ví dụ của bạn ở trên nên có text=auto, không chỉ textsau phần mở rộng tập tin. Chẳng hạn, các tệp dấu chân KiCad (phần mở rộng ".kicad_mod"), được chuẩn hóa bằng cách sử dụng dòng này trong tệp gitattribut của chúng: *.kicad_mod text=auto( kicad-pcb.org/lologists/klc/G1.7 ).
Gabriel Staples

64

Nó đảm bảo kết thúc dòng được chuẩn hóa. Nguồn: Kernel.org

Khi văn bản được đặt thành "tự động", đường dẫn được đánh dấu để chuẩn hóa tự động cuối dòng. Nếu git quyết định rằng nội dung là văn bản, các kết thúc dòng của nó sẽ được chuẩn hóa thành LF khi đăng ký.

Nếu bạn muốn tương tác với hệ thống quản lý mã nguồn thực thi chuẩn hóa cuối dòng hoặc đơn giản là bạn muốn tất cả các tệp văn bản trong kho lưu trữ của mình được chuẩn hóa, thay vào đó, bạn nên đặt thuộc tính văn bản thành "tự động" cho tất cả các tệp.

Điều này đảm bảo rằng tất cả các tệp mà git coi là văn bản sẽ có các kết thúc dòng được chuẩn hóa (LF) trong kho lưu trữ.


12
Ý bạn là gì khi kết thúc dòng chuẩn hóa?
Fizer Khan

14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych

11
Điều quan trọng cần biết, điều này sẽ ghi đè cài đặt core.autocrlf cục bộ trên máy của bạn, xem câu trả lời tuyệt vời này của
@Daniel

1
Sẽ rất tuyệt nếu git đơn giản không $% # với bất kỳ tệp nào được kiểm tra vào kho lưu trữ. Tôi đã làm việc với SLM, PerForce, MsBuild, Source Depot, TFS, SVM, không ai trong số này sẽ thay đổi ngay cả một byte trong bất kỳ tệp nào của bạn. Đây là một vụ hack táo bạo IMO và nó đã gây cho tôi rất nhiều đau đớn.
Vance McCorkle

1
Điều gì xảy ra khi thanh toán chỉ là một nửa câu chuyện - điều gì xảy ra khi nhận được? Sẽ là đúng khi nói rằng khi thanh toán, kết thúc dòng vẫn như LF, ngay cả trên các cửa sổ?
Anthony

8

Cấu hình đó liên quan đến cách xử lý kết thúc dòng. Khi được bật, tất cả các kết thúc dòng được chuyển đổi thành LF trong kho lưu trữ. Có các cờ khác để xử lý cách kết thúc dòng được chuyển đổi trong thư mục làm việc của bạn. Thông tin đầy đủ về vấn đề chúng tôi ở đây: https://www.kernel.org/pub/software/scm/git/docs/gitattribut.html

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.