Có cách nào để ngăn git thay đổi quyền và quyền sở hữu khi kéo không?


11

Mỗi lần tôi làm git pullhoặc git reset, gitđặt lại các thay đổi về quyền và quyền sở hữu mà tôi đã thực hiện. Xem cho chính mình:

#!/usr/bin/env bash
rm -rf 1 2

mkdir 1
cd 1
git init
echo 1 > 1 && git add 1 && git ci -m 1

git clone . ../2
cd $_
chmod 0640 1
chgrp http 1

cd ../1
echo 12 > 1 && git ci -am 2

cd ../2
stat 1
git pull
stat 1

Đầu ra:

$ ./1.sh 2>/dev/null | grep -F 'Access: ('
Access: (0640/-rw-r-----)  Uid: ( 1000/    yuri)   Gid: (   33/    http)
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    yuri)   Gid: ( 1000/    yuri)

Có cách nào để làm việc xung quanh nó?

Tôi muốn làm cho một số tập tin / thư mục có thể truy cập để viết bởi máy chủ web.

Câu trả lời:


4

Âm thanh này giống như người dùng bạn đang chạy có nhóm mặc định được đặt thành yuri. Bạn có thể xác nhận điều này như vậy:

$ id -a
uid=1000(saml) gid=1000(saml) groups=1000(saml),10(wheel),989(wireshark)

UID của tài khoản của bạn là thế này: uid=1000(saml)trong khi nhóm mặc định là git=1000(saml)và bất kỳ nhóm thứ cấp nào sau đó.

LƯU Ý: Nếu bạn muốn bản sao git có quyền sở hữu cụ thể, thì bạn có ít nhất 2 tùy chọn.

Lựa chọn 1

Đặt thư mục mẹ với các quyền như bạn muốn:

$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir

$ cd topdir
$ git clone ....

Điều này buộc thư mục topdirphải thực thi bất kỳ thư mục con nào bên dưới nó để httpáp dụng nhóm . Điều này sẽ hoạt động với quy mô lớn nhưng có thể dẫn đến các vấn đề, vì nếu bạn di chuyển tệp vào không gian làm việc git clone này, các tệp đó sẽ không có các nhóm của chúng được thực thi bởi các thay đổi được thực hiện ở trên.

Lựa chọn 2

Trước khi thực hiện công việc, hãy thay đổi nhóm mặc định của bạn thành httpnhư vậy:

$ newgrp http
$ git clone ...

Phương pháp này sẽ buộc bất kỳ tệp mới nào được tạo để đặt nhóm của chúng httpthay vì nhóm mặc định thông thường của bạn yuri, nhưng điều này sẽ chỉ hoạt động miễn là bạn nhớ thực hiện newgrptrước khi làm việc trong không gian làm việc này.

Sự lựa chọn khác

Nếu cả hai điều này có vẻ chấp nhận được, bạn có thể thử sử dụng ACL thay vào thư mục git workspace. Những điều này được thảo luận trong nhiều câu hỏi và trả lời trên trang web này, chẳng hạn như trong câu hỏi và trả lời này có tiêu đề: Bắt các tệp mới để kế thừa quyền của nhóm trên Linux .


Đầu tiên, bạn phải có ý nghĩa newgrp. Sau đó, nó có thay đổi nhóm cho vỏ hiện tại không? Và cuối cùng, vấn đề là chỉ tạo các tệp / thư mục cụ thể có thể truy cập để ghi bởi máy chủ web. Rốt cuộc, tôi có lẽ nên sửa chúng bằng tay, hoặc thiết lập một số githook ...
x-yuri

@ x-yuri - vâng, xin lỗi, đã 5 giờ sáng và tôi chuẩn bị đi ngủ 8-). Vâng, điều này chỉ tồn tại cho lớp vỏ hiện tại, vì vậy đó sẽ là nhược điểm của phương pháp đó. Nếu bạn dự định chỉ có quyền truy cập nhất định cho máy chủ web thì điều đó sẽ rất khó khăn và có thể bạn sẽ muốn sử dụng ACL sau đó. Ngoài ra, bạn có thể muốn thêm các chi tiết này vào Q. Vì hiện tại, không rõ mục đích dự định của bạn là gì, vì vậy tôi chỉ có thể trả lời bạn bằng các thuật ngữ không cụ thể.
slm

1
@ x-yuri - một hook cập nhật bài đăng như thế này có thể thích hợp hơn: stackoverflow.com/questions/9613545/ ích
slm

1
@ x-yuri - quyền kiểm soát được thảo luận trong sách git dưới hook: git-scm.com/book/en/Customizing-Git-Git-Hooks
slm

Tôi thực sự không thấy cách thay đổi nhóm cho vỏ hiện tại có thể là một nhược điểm, thành thật mà nói. Tôi lo ngại về việc nó không thay đổi cách thức hoạt động của các ứng dụng còn lại.
x-yuri

2

Giải pháp tôi sử dụng là chạy lệnh với tư cách là người dùng có quyền mà bạn muốn giữ:

sudo -u user command

Điều này giữ cho các quyền không thay đổi. Tôi sử dụng nó khi cập nhật kho git trên VPS của mình, trong khi vẫn giữ quyền truy cập tệp được đặt cho người dùng máy chủ web.

Xem thêm câu hỏi tương tự ở đây .

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.