Czy istnieje sposób, aby zapobiec zmianie uprawnień i własności przez git podczas ściągania?

11

Za każdym razem zrobić git pullalbo git reset, gitresetuje się zmienia uprawnień i własności zrobiłem. Sam zobacz:

#!/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

Wyjście:

$ ./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)

Czy istnieje sposób obejścia tego?

Chcę, aby niektóre pliki / katalogi były dostępne do zapisu przez serwer WWW.

x-yuri
źródło

Odpowiedzi:

4

Wygląda na to, że prowadzony użytkownik ma domyślną grupę ustawioną na yuri. Możesz to potwierdzić w następujący sposób:

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

Identyfikator UID Twojego konta jest następujący: uid=1000(saml)podczas gdy domyślną grupą jest, git=1000(saml)a następnie wszystkie grupy drugorzędne.

UWAGA: Jeśli chcesz, aby klon git miał określoną własność, masz co najmniej 2 opcje.

Opcja 1

Ustaw katalog nadrzędny z uprawnieniami tak, jak chcesz:

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

$ cd topdir
$ git clone ....

Zmusiło to katalog topdirdo wymuszenia umieszczenia pod nim wszystkich katalogów podrzędnych do httpzastosowania grupy . Będzie to działać w dużej mierze, ale może powodować problemy, ponieważ jeśli przeniesiesz pliki do tego obszaru roboczego klonowania git, te pliki nie będą wymuszane przez swoje grupy za pomocą powyższych zmian.

Opcja 2

Przed rozpoczęciem pracy zmień domyślną grupę, aby http:

$ newgrp http
$ git clone ...

Ta metoda wymusi na utworzeniu nowych plików, aby ich grupa była ustawiona na httpzamiast zwykłej domyślnej grupy yuri, ale będzie to działać tylko tak długo, jak pamiętasz, aby zrobić to newgrpwcześniej przed pracą w tym obszarze roboczym.

Inne opcje

Jeśli żaden z nich nie wydaje się akceptowalny, możesz spróbować użyć list ACL zamiast w katalogu obszaru roboczego git. Zostały one omówione w wielu pytaniach i odpowiedziach na tej stronie, takich jak pytania i odpowiedzi zatytułowane: Pobieranie nowych plików w celu dziedziczenia uprawnień grupy w systemie Linux .

slm
źródło
Po pierwsze, musisz mieć znaczenie newgrp. Czy zatem zmienia grupę tylko dla bieżącej powłoki? I wreszcie chodziło o to, aby tylko określone pliki / katalogi były dostępne do zapisu przez serwer WWW. W końcu prawdopodobnie powinienem je naprawić ręcznie lub ustawić githak ...
x-yuri,
@ x-yuri - tak, przepraszam, jest tu piąta rano i już idę do łóżka 8-). Tak, to dotyczy tylko bieżącej powłoki, więc byłoby to wadą tego podejścia. Jeśli zamierzasz mieć tylko pewien dostęp do serwera WWW, będzie to trudne i prawdopodobnie będziesz chciał wtedy używać list ACL. Możesz także dodać te szczegóły do ​​swojego Q. W tej chwili nie jest jasne, jaki jest twój zamierzony cel, więc mogę odpowiedzieć tylko w sposób nieokreślony.
slm
1
@ x-yuri - taki haczyk po aktualizacji może być bardziej trafny: stackoverflow.com/questions/9613545/…
slm
1
@ x-yuri - kontrola uprawnień została omówiona w książce git pod hasłami
slm
Szczerze mówiąc, nie widzę, jak zmiana grupy tylko dla bieżącej powłoki może być wadą. Martwiłem się, że nie zmieni to sposobu działania pozostałych aplikacji.
x-yuri
2

Rozwiązaniem, którego używam, jest uruchomienie polecenia jako użytkownik, który ma uprawnienia, które chcesz zachować:

sudo -u user command

Dzięki temu uprawnienia się nie zmieniają. Używam go podczas aktualizacji repozytoriów git na moim VPS, jednocześnie zachowując uprawnienia do plików ustawione dla użytkownika serwera WWW.

Zobacz także to samo pytanie tutaj .

Deleet
źródło