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?
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:
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-index
lệ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ên100755
cho những người thực thiBạn có thể hình dung nó bằng cách sử dụng ls-file
tiểu ban, với --stage
tù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.fileMode
tù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
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 644
hoặc755
(đánh vần ( 100644
và 100755
; các 100
phươ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à 022
xóa quyền ghi khỏi "nhóm" và "khác" hoặc 002
chỉ xóa quyền ghi khỏi "khác". Cũng có thể là 077
nế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ế độ 664
trong đó. 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.
e44794706eeb57f2ee38ed1604821aa38b8ad9d2
, nghĩa là, trước phiên bản Git 0.99.