Git ändern der Standard-umask, wenn die update-Datei
Ich habe ein problem mit Git. Ich suchte nach einer Lösung bei Google und StackOverflow, aber nichts hilft.
Das problem ist, dass jedes mal, wenn git-updates einige Dateien im Arbeitsverzeichnis (wenn ich checkout Filialen oder ich merge branch etc.) dann die Datei Berechtigungen geändert werden, so dass der "beschreibbaren Gruppe" flag Hinzugefügt.
Und mein apache zeigt "Error 500" für die Datei, wenn es beschreibbar ist, zur Gruppe.
Beispiel:
Ich habe eine Datei index.php. Berechtigungen sind "-rwxr-xr-x". Aktuelle (aktive) branch ist master. Diese Datei wurde geändert, in der Branche "entwickeln".
Führe ich ein "git checkout develop" und die Datei index.php bekommt Rechte "-rwxrwxr-x" (schreibbar für die Gruppe Hinzugefügt wird). Und meine Website nicht mehr funktioniert. Wie der apache nicht erlaubt dieses flag in php-Dateien (ich weiß nicht warum, aber ich kann diese nicht ändern).
Jedes mal, wenn ich ausführen von "git checkout develop" ich ausführen müssen, auch "chmod g-w index.php". Ich weiß nicht, wie das ausführen von zwei Befehlen (und manchmal vergesse ich, dies auszuführen und meine Website funktioniert nicht).
Was kann ich tun, um dieses problem zu lösen?
Ich denke, das hat etwas mit umask. Ich habe einige der tricks, die ich gefunden im Internet, aber nichts funktioniert.
Dank.
InformationsquelleAutor der Frage Roman Gelembjuk | 2012-07-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es irgendwie gefährlich zu ermöglichen file execution als eine binäre.
Jedenfalls habe ich das problem mit umask. Meine
post-receive
Skript sieht wie folgt aus:So,
file permission
s eingestellt664
unddirectory permissions
eingestellt775
die passt mir perfekt.P. S.-Einstellung umask in einer
.profile
Dateigit
Benutzer hat keine Wirkung, und ich verstehe nicht, warum, bitte auskommentieren, wenn du weißt, warum dies geschieht.InformationsquelleAutor der Antwort zogby
Schnelle Antwort, ist diese shell-Funktion in Ihrem
~/.profile
. Eine Erklärung folgt.Einen umask ist die Eigenschaft eines Prozesses. Es ist geerbt von der übergeordneten Prozess und kann verändert werden, von innen später. Der Befehl zum ändern der umask ist in der Regel namens umask zu.
Git hat keine Konfigurations-option zum setzen der umask, es ändert nicht die umask, nachdem es ausgeführt wird. Setzen Sie Git ' s umask von außen, lass es sein, vererbt vom übergeordneten Prozess (meist eine shell).
Mmm, scheinen Sie nicht zu mögen die Idee, dass alles außer git geändert hat umask. So ändern wir es einfach bei der Ausführung
git
.Wenn ein shell führt eine Linie, dauert es das erste Wort auf die Linie und versucht, eine Funktion mit diesem Namen. Nur wenn keiner da ist, versucht es, suchen Sie einen Befehl, der die Namen in
PATH
. Die Funktion die ich oben geschrieben hab ist benanntgit
also keine direkten Aufruf vongit
führt nun anstelle desgit
Befehl.Die Funktion führt eine subshell, ändert seine umask und führt die
git
Befehl von innerhalb der subshell. Nach dem Git seine Arbeit beendet, der subshell auch beendet und die original-shell-Instanz immer noch die original-umask.Aber die Funktion zeigt auch, wie der bypass an sich. Wenn Sie anrufen
git
übercommand git
oder sogar/usr/bin/git
die Funktion nicht aufgerufen werden. Für jede angemessene Nutzung dieser ist gut genug, obwohl.InformationsquelleAutor der Antwort Palec
Ich habe gerade das erreichen dieses problem, wenn die überprüfung aus einem repo um ein home-Verzeichnis eingehängt über NFS auf Ubuntu 14.04 (Trusty) mit der zurückportierte Xenial version 4.x-linux-Kernel.
Git clone in ein lokales Verzeichnis war in Ordnung. Noch merkwürdiger: Eine zweite Ubuntu-14.04-server nicht weisen das gleiche problem auf der gleichen installierten Verzeichnis.
Nach viel herumstöbern war ich in der Lage, um zu sehen, mit strace, git, genannt open () - system-Aufruf zum erstellen der Datei mit den Optionen O_CREAT,O_WRONLY und O_EXCL und mode von 0666, aber dann die nächsten syscal war ein fstat() gegen die Datei und sagte mir, es sei 0700-Modus . In meinem Fall das problem betraf nur bestimmte Dateien im repo. Trotz "git ls-index' zeigt-Modus 0644 für die meisten Dateien, einige von Ihnen wurden ordnungsgemäß erstellt und die andere nicht; zwar war es immer die selben Dateien, die hatten falsche Berechtigungen auf Klon.
Bemerkte ich, dass gab es ein Unterschied in der Kernel-version zwischen den beiden Systemen und entdeckte dann den folgenden Fehler: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1654288
Dem kernel-Upgrade auf 4.4.0-98 (4.4.0-59) wurde dieser für mich.
Ich überprüfte einige hosts immer noch mit der version 3.x-Linux-Kernel und das war nicht das problem.
InformationsquelleAutor der Antwort JonathanDIT
Durch Haken ändern Datei-Modus nach dem Check-out ist die Lösung des Problems, nachdem es bereits aufgetreten. Sie haben bereits schlechte Datei-Modus in das Dateisystem beim ausführen den Haken. Wenn eine Anfrage kommt nur zwischen der Kasse und dem Haken, der Ausführung, der server antwortet mit dem 500-Fehler. Aber Sie können daran interessiert sein, diese Lösung sowieso.
Benötigen Sie eine
post-checkout
Haken ausgeführtchmod g-w
alle erforderlichen Dateien. Der Haken ist.git/hooks/post-checkout
sollte ausführbar sein und bekommt die aktuelleHEAD
als zweiten parameter ($2 in der Schale). Der Haken könnte wie folgt Aussehen:Als der Haken nicht erhalten Liste der Dateien überprüft, kann dies die beste Umsetzung möglich. Es ändert den Modus alle Dateien im aktuellen
HEAD
.InformationsquelleAutor der Antwort Palec