Làm cách nào để thêm quyền chmod vào tệp trong GIT?


182

Tôi muốn git commit một tệp .sh, nhưng muốn nó có thể được thực thi khi tôi kiểm tra cùng một tệp trong một máy chủ khác.

Có cách nào để làm như vậy mà không cần thủ công chmod u + x tệp đó trong các máy chủ kiểm tra tệp không?

Câu trả lời:


291

Theo tài liệu chính thức , bạn có thể đặt hoặc xóa cờ "thực thi" trên bất kỳ tệp được theo dõi nào bằng update-indexlệnh phụ.

Để đặt cờ, sử dụng lệnh sau:

git update-index --chmod=+x path/to/file

Để loại bỏ nó, sử dụng:

git update-index --chmod=-x path/to/file

Dưới mui xe

Mặc dù điều này trông giống như hệ thống cấp phép tập tin unix thông thường, nhưng thực tế không phải vậy. Git duy trì một "chế độ" đặc biệt cho mỗi tệp trong bộ nhớ trong của nó:

  • 100644 cho các tập tin thường xuyên
  • 100755 cho những người thực thi

Bạn có thể hình dung nó bằng cách sử dụng ls-filetiểu ban, với --stagetùy chọn:

$ git ls-files --stage
100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0       .gitignore
100755 0ac339497485f7cc80d988561807906b2fd56172 0       my_executable_script.sh

Theo mặc định, khi bạn thêm một tệp vào kho lưu trữ, Git sẽ cố gắng tôn vinh các thuộc tính hệ thống tệp của nó và đặt mã tệp chính xác cho phù hợp. Bạn có thể tắt core.fileModetùy chọn này bằng cách đặt tùy chọn thành false:

git config core.fileMode false

Xử lý sự cố

Nếu tại một thời điểm nào đó, tên tệp Git không được đặt nhưng tệp có cờ hệ thống tệp chính xác, hãy thử xóa chế độ và đặt lại:

git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file

Tặng kem

Bắt đầu với Git 2.9, bạn có thể tạo tập tin VÀ đặt cờ trong một lệnh:

git add --chmod=+x path/to/file

Khi tôi làm điều đó để test.sh, git commit và đẩy và kiểm tra trong một máy chủ khác, đây là những sự cho phép của tập tin đó: -rw-rw-r-- 1 người dùng 12/12 5 11:42 test.sh
Henley Chiu

Tôi vừa thực hiện thử nghiệm trên một trong các kho lưu trữ của tôi và nó hoạt động như mong đợi. Các quyền đã được đặt trên tệp bằng lệnh được cung cấp trong Windows. Trên một trong các máy chủ của tôi (Debian), tệp đã có quyền -rw-r - r-- trước đây, bây giờ được đặt thành -rwxr-xr-x. Phiên bản git nào bạn sử dụng trên các máy cục bộ và từ xa?
Antwane

git phiên bản 1.9.5 tại địa phương của tôi và git 1.7.1 trong máy chủ thực hiện kiểm tra.
Henley Chiu

Chỉ cần cố gắng sao chép trên một máy chủ (cũ) khác với git 1.7.10, nó vẫn hoạt động tốt, tập tin có x quyền. Có thể bạn đã mắc lỗi tại một số điểm hoặc bạn gặp sự cố về quyền với người dùng đã nhân bản trên máy chủ từ xa
Antwane

Lưu ý rằng bạn chỉ có thể thay đổi (đặt hoặc xóa) quyền thực thi. Git không theo dõi bất kỳ sự cho phép nào khác (chẳng hạn như quyền đọc hoặc viết).
Dan Anderson

25

Câu trả lời của Antwane là chính xác và đây sẽ là một nhận xét nhưng các bình luận không có đủ không gian và không cho phép định dạng. :-) Tôi chỉ muốn nói thêm rằng trong Git, cho phép tập tin được ghi nhận chỉ 1 là một trong hai 644hoặc755 (đánh vần ( 100644100755; các 100phương tiện phần "thường xuyên tập tin"):

diff --git a/path b/path
new file mode 100644

Bộ xử lý trước đây của lớp 644 có nghĩa là tập tin không nên được thực thi và cái sau có nghĩa là nó phải được thực thi. Làm thế nào mà biến thành các chế độ tệp thực tế trong hệ thống tệp của bạn phụ thuộc vào hệ điều hành. Trên các hệ thống giống như Unix, các bit được truyền quaumask cài đặt , thông thường sẽ là 022xóa quyền ghi khỏi "nhóm" và "khác" hoặc 002chỉ xóa quyền ghi khỏi "khác". Cũng có thể là 077nếu bạn đặc biệt quan tâm đến quyền riêng tư và muốn xóa, đọc và thực thi quyền từ cả "nhóm" và "khác".


1 Phiên bản cực kỳ sớm của Git đã lưu các quyền của nhóm, do đó một số kho lưu trữ có các mục cây có chế độ 664trong đó. Modern Git thì không, nhưng vì không có phần nào của bất kỳ đối tượng nào có thể thay đổi, các bit quyền cũ đó vẫn tồn tại trong các đối tượng cây cũ.

Việc thay đổi chỉ lưu trữ 0644 hoặc 0755 là trong cam kết e44794706eeb57f2 , trước Git v0.99 và ngày 16 tháng 4 năm 2005.


"Phiên bản đầu của Git" có ý tưởng nào phiên bản chính xác bị ảnh hưởng bởi điều này không?
dùng5359531

2
@ user5359531 phiên bản trước khi cam kết e44794706eeb57f2ee38ed1604821aa38b8ad9d2, nghĩa là, trước phiên bản Git 0.99.
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.