Pytanie Git zmienia domyślną wartość umask przy aktualizacji pliku


Mam problem z Git. Szukałem rozwiązania w Google i w StackOverflow, ale nic nie pomaga.

Problem polega na tym, że za każdym razem, gdy git aktualizuje jakiś plik w katalogu roboczym (gdy kupuję gałęzie kasowe lub scalam gałąź itp.), Uprawnienia do plików zmieniają się tak, że dodana jest flaga "writable to group". I mój apache pokazuje "Błąd 500" dla pliku, jeśli jest zapisywalny do grupy.

Przykład: Mam plik index.php. Uprawnienia to "-rwxr-xr-x". Bieżąca (aktywna) gałąź to master. Ten plik został zmieniony w gałęzi "rozwijaj". Wykonuję "git checkout develop", a plik index.php otrzymuje uprawnienia "-rwxrwxr-x" (dodaje się zapisywalny do grupy). Moja witryna przestaje działać. Apache nie zezwala na tę flagę w plikach php (nie wiem dlaczego, ale nie mogę tego zmienić).

Za każdym razem, gdy wykonuję "git checkout develop", muszę wykonać także "chmod g-w index.php". Nie lubię wykonywać dwóch poleceń (i czasami zapominam o wykonaniu tego, a moja strona nie działa).

Co mogę zrobić, aby rozwiązać ten problem? Myślę, że jest to coś związanego z umask. Zrobiłem kilka sztuczek, które znalazłem w Internecie, ale nic nie działa.

Dzięki.


17
2017-07-20 06:53


pochodzenie


Czy jest jakiś powód, dla którego nie możesz po prostu ustawić swojej umask odpowiednio (tj. Na 0022 lub podobną)? - CB Bailey
Jak to zrobić? Aby ustawić umask? Czy ten system zmienia się, czy tylko zmienia git? Jeśli system to nie mogę tego zmienić - Roman Gelembjuk
Po prostu biegnij umask 0022. Aby ustawić go na sesje interaktywne, umieść to polecenie w swoim .bashrc lub odpowiednik powłoki. Aby ustawić zawsze, ale to w twoim .profile. - CB Bailey
Nie chcę zmieniać żadnych ustawień systemowych. Witryna działa z tym użytkownikiem. Obawiam się, że to może wpłynąć na coś innego. Czy istnieje sposób na rozwiązanie problemu tylko przy zmianie ustawień git? Wiem, że w git są hacki do aktualizacji. Ale nie mogę znaleźć sposobu rozwiązania tego za pomocą haków. - Roman Gelembjuk
To nie jest kwestia git, to kwestia umask; jeśli strona działa jako ten użytkownik i działa tylko wtedy, gdy ten użytkownik tworzy plik, który nie jest zapisywalny w grupach, to na pewno chcieć zmienić wartość umask tego użytkownika na 0022. (.profile są użytkownik ustawienia, a nie ustawienia systemowe) - CB Bailey


Odpowiedzi:


Jest to dość niebezpieczne, aby zezwolić na wykonanie pliku jako plik binarny. W każdym razie rozwiązałem problem za pomocą umask. Mój post-receive skrypt wygląda następująco:

!/bin/sh
umask 002
GIT_WORK_TREE=/var/www/site git checkout -f

Więc, file permissions ustawiono na 664 i directory permissions Ustawić 775, który idealnie mi pasuje.

P.S. Ustawianie umask w a .profile plik git użytkownik nie ma żadnego efektu i nie rozumiem, dlaczego, proszę skomentować, jeśli wiesz, dlaczego tak się dzieje.


8
2017-08-22 06:53



umask 0022 byłoby bardziej sensowne dla zwykłego serwera WWW, ponieważ tylko właściciel będzie miał prawo zapisu: Wynik file permission644 i directory permissions 755 - Laszlo Schürg


Szybka odpowiedź to ta funkcja powłoki, którą należy umieścić w twoim ~/.profile. Wyjaśnienie następuje.

git(){(umask 0022; command git "$@")}

ZA umask jest własnością procesu. Jest dziedziczony z procesu nadrzędnego i może zostać zmieniony z wnętrza później. Polecenie zmiany umask jest zwykle również nazywane umask.

Git nie ma opcji konfiguracyjnej do ustawienia swojej maski, nie zmienia swojej umask po wykonaniu. Musisz ustawić umask Git z zewnątrz, niech to będzie dziedziczone z procesu nadrzędnego (zwykle powłoki).

Mmm, wydajesz się nie lubić idei, że cokolwiek z wyjątkiem gita zmieniło umask. Zmieńmy to po prostu podczas wykonywania git.

Kiedy powłoka wykonuje linię, pobiera pierwsze słowo na linii i próbuje znaleźć funkcję o tej nazwie. Tylko jeśli nie ma, próbuje zlokalizować polecenie o tej nazwie w PATH. Funkcja, którą napisałem powyżej, została nazwana git, zatem każde bezpośrednie wywołanie git teraz wykonuje go zamiast git dowództwo.

Funkcja wykonuje podpowłokę, zmienia jej umask i wykonuje znak git polecenie z wnętrza podpowłoki. Po tym, jak Git zakończy pracę, podpowłoce również zostaną zamknięte, a oryginalna instancja powłoki nadal będzie miała oryginalną umask.

Jednak funkcja pokazuje także, jak ominąć samą siebie. Jeśli zadzwonisz git przez command git lub nawet /usr/bin/git, funkcja nie zostanie wywołana. Jednak przy każdym przyzwoitym użyciu jest to wystarczająco dobre.


5
2017-11-04 15:14





Właśnie pojawiał się ten problem podczas sprawdzania repo do katalogu domowego zamontowanego przez NFS na Ubuntu 14.04 (Trusty) przy użyciu backported Xenial version 4.x linux Kernel. Klon Git do lokalnego katalogu był w porządku. Jeszcze dziwniejsze: drugi serwer Ubuntu 14.04 nie wykazywał tego samego problemu na tym samym zamontowanym katalogu.

Po wielu grzebaniu mogłem zobaczyć, używając strasu, który git wywołał wywołanie systemowe open (), aby utworzyć każdy plik z opcjami O_CREAT, O_WRONLY i O_EXCL i trybem 0666, ale następny syscal był fstat () przeciwko plik i powiedział mi, że to był tryb 0700. W moim przypadku problem dotyczył tylko niektórych plików w repozytorium. Pomimo "git ls-index" pokazującego tryb 0644 dla większości plików, niektóre z nich były tworzone poprawnie, a inne nie; chociaż zawsze były to te same pliki, które miały złe uprawnienia do klonowania.

Zauważyłem, że między dwoma systemami istnieje różnica w wersji jądra, a następnie wykryto następujący błąd: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1654288

Aktualizacja jądra do wersji 4.4.0-98 (z 4.4.0-59) naprawiła to za mnie. Sprawdziłem, czy niektóre hosty nadal używają jądra Linux w wersji 3.x, a te nie miały problemu.


3
2018-02-09 14:30





Używanie hooków do zmiany trybu pliku po kasie rozwiązuje problem po tym, jak już się pojawiło. Masz już zły tryb plików w systemie plików podczas wykonywania haka. Jeśli żądanie pojawi się tuż po sprawdzeniu i wykonaniu haka, serwer odpowie błędem 500. Ale i tak możesz być zainteresowany tym rozwiązaniem.

Potrzebujesz post-checkout uruchamianie haka chmod g-w we wszystkich niezbędnych plikach. Hak jest .git/hooks/post-checkout, powinien być wykonywalny i pobiera aktualny HEAD jako drugi parametr (2 $ w powłoce). Hak może wyglądać tak:

#!/bin/bash
git ls-files -z --with-tree="$2" | xargs -0 chmod g-w --

Ponieważ hak nie otrzymuje listy plików sprawdzonych, może to być najlepsza możliwa implementacja. Zmienia tryb wszystkich plików w bieżącym HEAD.


0
2017-11-04 15:52