Chcę kontrolować wersję mojego serwera internetowego zgodnie z opisem w sekcji Kontrola wersji mojego serwera WWW , tworząc repozytorium git z pliku /var/www directory
. Miałem nadzieję, że uda mi się wtedy przesłać zawartość sieciową z naszego serwera deweloperskiego na github, ściągnąć ją na nasz serwer produkcyjny i spędzić resztę dnia na puli.
Najwyraźniej dziwactwem w moim planie jest to, że Git nie respektuje uprawnień do plików (nie próbowałem tego, tylko czytam o tym teraz). Myślę, że ma to sens, ponieważ różne skrzynki mogą mieć różne ustawienia użytkownika / grupy. Ale jeśli chcę wymusić propagację uprawnień, wiedząc, że moje serwery są tak samo skonfigurowane, czy mam jakieś opcje? Czy jest łatwiejszy sposób podejścia do tego, co próbuję zrobić?
źródło
Odpowiedzi:
git-cache-meta
Wymienionych w SO pytanie „ git - jak odzyskać uprawnienia do plików git uważa, że plik powinien być ” (oraz FAQ git ) jest bardziej staightforward podejście.Chodzi o to, aby przechowywać w
.git_cache_meta
pliku uprawnienia do plików i katalogów.Jest to osobny plik, który nie jest wersjonowany bezpośrednio w repozytorium Git.
Dlatego jego użycie jest następujące:
Więc ty:
źródło
git ls-files
.Git to system kontroli wersji, stworzony do tworzenia oprogramowania, więc z całego zestawu trybów i uprawnień przechowuje tylko wykonywalny bit (dla zwykłych plików) i bit dowiązania symbolicznego. Jeśli chcesz przechowywać pełne uprawnienia, potrzebujesz narzędzia innej firmy, takiego jak
git-cache-meta
( wspomniane przez VonC ) lub Metastore (używane przez etckeeper ). Lub możesz użyć IsiSetup , który IIRC używa git jako zaplecza.Zobacz stronę Interfejsy, nakładki i narzędzia w witrynie Git Wiki.
źródło
/usr/share/git-core/contrib/hooks/setgitperms.perl
w swoimgit-contrib
pakiecie - skrypt do podobnego celu. ( „Skrypt ten może być używany do zapisu / przywrócenia pełne uprawnienia i dane własnościowe w drzewie roboczego git.”)To dość późno, ale może pomóc innym. Robię to, co chcesz, dodając dwa punkty zaczepienia git do mojego repozytorium.
.git / hooks / pre-commit:
.git / hooks / post-checkout:
Pierwszy hak jest wywoływany, gdy "zatwierdzasz" i odczytuje prawa własności i uprawnienia do wszystkich plików w repozytorium i przechowuje je w pliku w katalogu głównym repozytorium o nazwie .permissions, a następnie dodaje plik .permissions do zatwierdzenia.
Drugi hak jest wywoływany, gdy „wyewidencjonujesz” i przejdzie przez listę plików w pliku .permissions i przywróci własność oraz uprawnienia do tych plików.
źródło
$SELF_DIR/../../
niekoniecznie jest katalogiem głównym repozytorium ... ale nimgit rev-parse --show-toplevel
jest. (Nie jestem pewien, dlaczego nie używałbyś tylkopwd
dla bieżącego katalogu, ale i tak jest to dyskusyjne.)IFS=$'\n'
przedfor
pętlą, aby to zatrzymała (aunset IFS
później, aby była bezpieczna).chmod 0600 .pgpass
wpost-checkout
. Tak, będę musiał zaktualizować go ręcznie, ilekroć mam plik, który wymaga określonych uprawnień, ale to przerwy.Na wypadek, gdybyś teraz wchodził w to, właśnie przez to przeszedłem dzisiaj i mogę podsumować, na czym to polega. Jeśli jeszcze tego nie próbowałeś, niektóre szczegóły mogą pomóc.
Myślę, że podejście @Omid Ariyan jest najlepszym sposobem. Dodaj skrypty pre-commit i post-checkout. NIE zapomnij nazwać ich dokładnie tak, jak robi to Omid i NIE zapomnij uczynić ich wykonywalnymi. Jeśli zapomnisz któregokolwiek z nich, nie przyniosą one żadnego efektu i w kółko uruchamiasz "git commit", zastanawiając się, dlaczego nic się nie dzieje :) Ponadto, jeśli wycinasz i wklejasz z przeglądarki internetowej, uważaj, aby cudzysłowy i znaczniki nie były zmieniony.
Jeśli raz uruchomisz skrypt pre-commit (przez uruchomienie git commit), to zostanie utworzony plik .permissions. Możesz dodać go do repozytorium i myślę, że nie jest konieczne ciągłe dodawanie go na końcu skryptu pre-commit. Ale myślę, że to nie boli (mam nadzieję).
Istnieje kilka drobnych problemów związanych z nazwą katalogu i istnieniem spacji w nazwach plików w skryptach Omid. Przestrzenie były tutaj problemem i miałem problem z poprawką IFS. Dla przypomnienia, ten skrypt przed zatwierdzeniem działał poprawnie dla mnie:
Co z tego mamy?
Plik .permissions znajduje się na najwyższym poziomie repozytorium git. Ma jedną linię na plik, oto początek mojego przykładu:
Jak widać, mamy
W komentarzach na temat tego podejścia jeden z plakatów narzeka, że działa tylko z tą samą nazwą użytkownika i jest to technicznie prawda, ale bardzo łatwo to naprawić. Zwróć uwagę, że skrypt po kasie ma 2 elementy akcji,
Więc zatrzymuję tylko pierwszy, to wszystko, czego potrzebuję. Moja nazwa użytkownika na serwerze WWW jest rzeczywiście inna, ale co ważniejsze, nie możesz uruchomić chown, jeśli nie jesteś rootem. Może jednak uruchomić "chgrp". Jest wystarczająco jasne, jak to wykorzystać.
W pierwszej odpowiedzi w tym poście, tej, która jest najczęściej akceptowana, sugestia jest taka, aby użyć git-cache-meta, skryptu, który wykonuje tę samą pracę, którą wykonują skrypty przechwytujące przed / po (parsowanie danych wyjściowych z
git ls-files
) . Te skrypty są dla mnie łatwiejsze do zrozumienia, kod git-cache-meta jest raczej bardziej rozbudowany. Możliwe jest zachowanie git-cache-meta w ścieżce i pisanie skryptów przed zatwierdzeniem i po pobraniu, które by go używały.Spacje w nazwach plików są problemem w obu skryptach Omid. W skrypcie po zakupie będziesz wiedział, że masz spacje w nazwach plików, jeśli zobaczysz takie błędy
Sprawdzam rozwiązania tego problemu. Oto coś, co wydaje się działać, ale przetestowałem tylko w jednym przypadku
Ponieważ informacje o uprawnieniach są wyświetlane po jednym wierszu na raz, ustawiłem IFS na $, więc tylko podziały wierszy są postrzegane jako nowe rzeczy.
Czytałem, że BARDZO WAŻNE jest ustawienie zmiennej środowiskowej IFS z powrotem tak, jak było! Możesz zobaczyć, dlaczego sesja powłoki może pójść źle, jeśli zostawisz $ jako jedyny separator.
źródło
Możemy poprawić inne odpowiedzi, zmieniając format
.permissions
pliku nachmod
instrukcje wykonywalne i wykorzystując-printf
parametr nafind
. Oto prostszy.git/hooks/pre-commit
plik:... a oto uproszczony
.git/hooks/post-checkout
plik:Pamiętaj, że inne narzędzia mogły już skonfigurować te skrypty, więc może być konieczne ich scalenie. Na przykład, oto
post-checkout
skrypt, który zawiera równieżgit-lfs
polecenia:źródło
W przed zatwierdzeniem / po pobraniu opcją byłoby użycie narzędzia „mtree” (FreeBSD) lub „fmtree” (Ubuntu), które „porównuje hierarchię plików ze specyfikacją, tworzy specyfikację hierarchii plików lub modyfikuje specyfikacja."
Domyślny zestaw to flagi, gid, link, tryb, nlink, rozmiar, czas, typ i uid. Można to dopasować do określonego celu za pomocą przełącznika -k.
źródło
Używam FreeBSD 11.1, koncepcja wirtualizacji jail freebsd sprawia, że system operacyjny jest optymalny. Obecna wersja Gita, której używam to 2.15.1, wolę też uruchamiać wszystko na skryptach powłoki. Mając to na uwadze, zmodyfikowałem powyższe sugestie w następujący sposób:
git push: .git / hooks / pre-commit
git pull: .git / hooks / post-merge
Jeśli z jakiegoś powodu musisz odtworzyć skrypt, plik wyjściowy .permissions powinien mieć następujący format:
Dla pliku .gitignore z uprawnieniami 644 nadanymi root: wheel
Zauważ, że musiałem wprowadzić kilka zmian w opcjach statystyk.
Cieszyć się,
źródło
Dodatkiem do odpowiedzi @Omid Ariyan są uprawnienia do katalogów. Dodaj to po
for
pętlidone
w swoimpre-commit
skrypcie.Spowoduje to również zapisanie uprawnień do katalogu.
źródło