Làm cách nào để tạo quyền truy cập chế độ thực thi tệp trong Git trên Windows?


378

Tôi sử dụng Git trong Windows và muốn đẩy tập lệnh shell thực thi vào git repo bằng một cam kết.

Thông thường tôi cần làm hai bước ( git commit).

$ vi install.sh
$ git add install.sh  
$ git commit -am "add new file for installation" # first commit
[master f2e92da] add support for install.sh
 1 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 install.sh
$ git update-index --chmod=+x install.sh
$ git commit -am "update file permission"        # second commit
[master 317ba0c] update file permission
  0 files changed
  mode change 100644 => 100755 install.sh

Làm thế nào tôi có thể kết hợp hai bước này thành một bước? cấu hình git? cửa sổ lệnh?

Nhắc nhở : Hai câu trả lời là tốt, git add --chmod=+x fileđược hỗ trợ trong phiên bản git mới

Tham khảo: xem câu hỏi trong quyền của tệp Git trên Windows để xác nhận lần thứ hai


10
Với git 2.9.x / 2.10 (quý 3 năm 2016), git add --chmod=+xthực sự có thể. Xem câu trả lời của tôi dưới đây , tín dụng cho Edward Thomson .
VonC

5
Sẽ đáng để cập nhật câu trả lời được chọn cho git add --chmod=+xphiên bản
mikemaccana

Câu trả lời:


590

Không cần thực hiện điều này trong hai lần xác nhận, bạn có thể thêm tệp và đánh dấu tệp có thể thực thi được trong một lần xác nhận:

C:\Temp\TestRepo>touch foo.sh

C:\Temp\TestRepo>git add foo.sh

C:\Temp\TestRepo>git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

Như bạn lưu ý, sau khi thêm, chế độ là 0644 (nghĩa là không thể thực thi). Tuy nhiên, chúng ta có thể đánh dấu nó là có thể thực thi được trước khi cam kết:

C:\Temp\TestRepo>git update-index --chmod=+x foo.sh

C:\Temp\TestRepo>git ls-files --stage
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

Và bây giờ tập tin là chế độ 0755 (thực thi).

C:\Temp\TestRepo>git commit -m"Executable!"
[master (root-commit) 1f7a57a] Executable!
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100755 foo.sh

Và bây giờ chúng ta có một cam kết duy nhất với một tệp thực thi.


147

Thật vậy, thật tuyệt nếu git-addcó một --modelá cờ

git 2.9.x / 2.10 (quý 3 năm 2016) thực sự sẽ cho phép điều đó (nhờ Edward Thomson ):

git add --chmod=+x -- afile
git commit -m"Executable!"

Điều đó làm cho tất cả quá trình nhanh hơn và hoạt động ngay cả khi core.filemodeđược đặt thành false.

Xem cam kết 4e55ed3 (31 tháng 5 năm 2016) của Edward Thomson ( ethomson) .
Được giúp đỡ: Julian Schindelin ( dscho) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết c8b080a , ngày 06 tháng 7 năm 2016)

add: thêm --chmod=+x/ --chmod=-xtùy chọn

Bit thực thi sẽ không được phát hiện (và do đó sẽ không được thiết lập) cho đường dẫn trong một kho lưu trữ với core.filemodecác thiết lập để sai, mặc dù người dùng vẫn có thể muốn thêm các tập tin như thực thi cho phù hợp với những người dùng khác, những người làmcore.filemode chức năng.
Ví dụ: người dùng Windows thêm tập lệnh shell có thể muốn thêm chúng dưới dạng thực thi để tương thích với người dùng trên không phải Windows.

Mặc dù điều này có thể được thực hiện bằng lệnh hệ thống ống nước ( git update-index --add --chmod=+x foo), việc dạy git-addlệnh cho phép người dùng thiết lập một tệp thực thi với một lệnh mà họ đã quen thuộc .


22

Nếu các tệp đã được đặt cờ + x, git update-index --chmod=+xkhông có gì và git nghĩ rằng không có gì để cam kết, mặc dù cờ không được lưu vào repo.

Trước tiên, bạn phải xóa cờ, chạy lệnh git, sau đó đặt lại cờ:

chmod -x <file>
git update-index --chmod=+x <file>
chmod +x <file>

sau đó git thấy một thay đổi và sẽ cho phép bạn thực hiện thay đổi.


9

Lưu ý trước tiên là bạn phải chắc chắn về filemodecài đặt falsetrong tệp cấu hình git hoặc sử dụng lệnh này:

git config core.filemode false

và sau đó bạn có thể đặt quyền 0777 bằng lệnh này:

git update-index --chmod=+x foo.sh

3

Tôi không có touchchmodlệnh trong cmd.exe của tôi và git update-index --chmod=+x foo.shkhông hoạt động cho tôi.

Cuối cùng tôi cũng giải quyết nó bằng cách thiết lập skip-worktreebit:

git update-index --skip-worktree --chmod=+x foo.sh
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.