2010-02-25 34 views
41

Khi cố gắng chuẩn hóa nền tảng cho nhà phát triển, một trong những nhu cầu của tôi là cam kết .git/config để mọi người có cùng cấu hình CRLF mà không quên đặt nó bằng tay.Phân phối cấu hình git bằng mã

Làm cách nào để thiết lập điều này?

Tôi có chút lo ngại về tất cả các tiêu cực này so với autocrlf. Tại sao không xóa tính năng này nếu nó không hoạt động? Các nhà sản xuất của tính năng này bị hiểu lầm hoặc họ đã thực hiện một thử nghiệm không thành công với nó và nó phải được loại bỏ để ngăn chặn nhiều người lãng phí thời gian của họ (đọc trang người tối nghĩa, đặt câu hỏi, mọi người trả lời những câu hỏi đó, v.v.).

+2

Xem thêm http://stackoverflow.com/questions/2332349/best-practices-for-cross-platform-git-config: bạn có thể có một câu trả lời để thêm vào câu hỏi tương tự này. – VonC

+2

cảm ơn, nhưng tôi là một chút quan tâm của tất cả các tiêu cực chống lại autocrlf, tại sao không loại bỏ tính năng này nếu nó không hoạt động?Các nhà sản xuất của tính năng này bị hiểu lầm hoặc họ đã thực hiện một thử nghiệm không thành công với nó và nó sẽ bị xóa để ngăn chặn nhiều người lãng phí thời gian của họ hơn (đọc trang người tối nghĩa, đặt câu hỏi, mọi người trả lời những câu hỏi đó, v.v.) – nraynaud

Trả lời

67

Tôi luôn tìm thấy thuộc tính cấu hình autocrlf. (như thể hiện trong câu trả lời của tôi Git 1.6.4 beta on Windows (msysgit) - Unix or DOS line termination)

Lưu ý: msysgit issue 538 để đặt thành true (giá trị mặc định do trình cài đặt msysgit), nhưng tôi không thuyết phục.

Tôi muốn một trong ba giải pháp sau cho:

  • cấu hình một phong cách end-of-line
  • làm cấu hình mà tuyên truyền thông qua các hợp đồng mua Git khác nhau

1. Sử dụng mới config setting core.eol (1.7.2+)

Đặt loại kết thúc dòng để sử dụng i n thư mục làm việc cho các tệp có thuộc tính văn bản được đặt.
Các giải pháp thay thế là 'lf', 'crlf' và 'native', sử dụng dòng gốc của nền tảng kết thúc.
Giá trị mặc định là gốc.

2. a checkout/checking .gitattribute. Xem gitattributes trang của người đàn ông: crlf hoặc core.autocrlf là cách ghi trong tệp .gitattributes trước đây là thuộc tính cấu hình cục bộ.

3.một git attribute filter driver có thể:

  • thực thi bất kỳ loại tiêu chuẩn định dạng mà bạn có thể muốn thiết
  • áp dụng những tiêu chuẩn để một số tập tin/thư mục
  • được ghi lại như một tập tin cấu hình (.gitattributes) có thể được đẩy bất cứ nơi nào .
+0

Cảm ơn câu trả lời của bạn. Tôi nghĩ rằng tôi nhận được thông báo nhầm lẫn về autocrlf. Tôi đã đọc ở đâu đó mà git chỉ cam kết trong chế độ \ n và nó tốt. một số nhà phát triển của tôi đang sử dụng các cửa sổ và vì mọi người trên thế giới đều có thể đọc crlf, tôi chỉ nghĩ rằng crlf cho mọi người là tốt nhất. NHƯNG chúng ta phải chứa git người dường như chỉ như cr. Bạn nghĩ sao ? Tôi đang xem xét ý tưởng thuộc tính, tôi đã loại trừ nó trước đó bởi vì sự hiểu biết của tôi là nó áp dụng các công trình trên cơ sở cho mỗi tệp, không phải là toàn bộ kho lưu trữ. Có lẽ tôi đã nhầm. – nraynaud

+2

@narynaud: cá nhân, tôi thích ''\ n'', và tôi không muốn thay đổi anyhting về eol. Nhưng bạn nên thực thi một phong cách eol, '.gitattributes' thực sự thú vị vì bạn có thể áp dụng nó cho tất cả kho lưu trữ, hoặc chỉ cho các phần cụ thể trong repo. – VonC

+0

Nếu tôi xác định * + crlf tại gốc của dự án, tôi cho rằng tôi sẽ đến địa ngục với hình ảnh png của tôi? Làm thế nào tôi có thể nói "nếu bạn nghĩ rằng đó là văn bản sau đó làm crlf nếu không, làm nhị phân". Tôi muốn tránh đưa ra quyết định khó khăn của bản thân mình, hệ thống này là tốt tại đoán và gỡ lỗi này sẽ thực sự khó khăn. – nraynaud

5

Nếu bạn đang sử dụng hệ điều hành Unix gia đình, tôi khuyên bạn chỉ nên tạo liên kết tượng trưng.

ln -s .git/config git-config 
git add git-config 
git commit -m "Now tracking git config file" 
+0

ý tưởng, chúng tôi có hỗn hợp Windows/Mac/linux. Nhưng có lẽ git có thể sử dụng các cửa sổ liên kết công cụ, tôi sẽ cố gắng để google đó. – nraynaud

+0

nó không hoạt động, trên unix git không thấy những thay đổi đối với tệp cấu hình ngay cả với liên kết. – nraynaud

+2

Vâng, nếu bạn đang ở trên unix nó nên làm việc theo cách khác xung quanh mv .git/config git-config; cd .git; ln -s ../git-config config; cd ..; git thêm git-config; git commit -m "Bây giờ, hãy theo dõi tệp cấu hình git"; –

0

Có thể là một cách tốt hơn để sử dụng hardlink:

Trong * nix hoặc hệ thống OS X:

ln .git/config git-config 
git add git-config 
git commit -m "Now tracking git config file" 

Trong Windows trên hệ thống NTFS-hệ thống tập tin:

mklink /H git-config .git\config 
git add git-config 
git commit -m "Now tracking git config file" 

Nhưng chúng ta phải nhớ rằng khi nhân bản dự án để áp dụng các cài đặt để thực hiện quy trình ngược lại:

Trong hệ thống * nix hoặc OS X:

git clone FROM_PROJ_URL 
rm .git/config 
ln git-config .git\config 

Trong Windows trên hệ thống NTFS-hệ thống tập tin:

git clone FROM_PROJ_URL 
del .git\config 
mklink /H .git\config git-config 
0

Các .git/config thể được ghi đè địa phương bởi ~/.gitconfig.

Vì vậy, như một phần của tập lệnh xây dựng, Makefile hoặc cung cấp, bạn có thể đề xuất thay đổi cho người dùng vào ~/.gitconfig hoặc tải tập lệnh cục bộ .gitconfig qua git config.

Ví dụ, tạo mới .gitconfig với một số cài đặt và tải nó bằng cách:

git config --local include.path "/path/to/.gitconfig" 

hoặc yêu cầu người dùng phải có trong ~/.gitconfig những họ dòng:

[include] 
    path = .gitconfig 

Nếu bạn đang sử dụng Vagrant như một phần của phân phối mã, bạn có thể tải cấu hình git từ Vagrantfile theo:

system('GIT_TRACE=1 git config --local include.path "$(git rev-parse --show-toplevel)/git/gitconfig"'); 

sau đó cam kết cấu hình git của bạn trong git/gitconfig, vì vậy mỗi khi người dùng chạy cấp phép máy ảo của họ, tệp này sẽ được tải tự động cho git của họ trên máy chủ (ví dụ: để thực thi core.filemode bị vô hiệu hóa, vì vậy Windows sẽ không có bất kỳ sự cố nào với quyền đối với tệp).


Để buộc kết thúc dòng cho người dùng, bạn nên sử dụng .gitattributes thay vì sẽ hoạt động ngoài hộp. cú pháp mẫu để sử dụng kết thúc dòng Unix-like (LF):

# Drupal git normalization 
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html 
# @see https://www.drupal.org/node/1542048 

# Define text file attributes. 
# - Treat them as text. 
# - Ensure no CRLF line-endings, neither on checkout nor on checkin. 
# - Detect whitespace errors. 
# - Exposed by default in `git diff --color` on the CLI. 
# - Validate with `git diff --check`. 
# - Deny applying with `git apply --whitespace=error-all`. 
# - Fix automatically with `git apply --whitespace=fix`. 

*.css  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 
*.html text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html 
*.js  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 
*.json text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 

# Auto-detect text files, ensure they use LF. 
*   text=auto eol=lf 

# Define binary file attributes. 
# - Do not treat them as text. 
# - Include binary diff in patches instead of "binary files differ." 
*.gz  -text diff 
Các vấn đề liên quan