Gibt es eine Möglichkeit zu verhindern, dass Git die Berechtigungen und den Besitz beim Ziehen ändert?

11

Jedes Mal , wenn ich zu tun git pulloder git reset, gitändert sie setzt , um Berechtigungen und Eigentum ich gemacht. Überzeugen Sie sich selbst:

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

Die Ausgabe:

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

Gibt es eine Möglichkeit, das zu umgehen?

Ich möchte einige Dateien / Verzeichnisse für das Schreiben durch den Webserver zugänglich machen.

x-yuri
quelle

Antworten:

4

Dies klingt so, als ob für den Benutzer, den Sie ausführen, die Standardgruppe festgelegt ist yuri. Sie können dies folgendermaßen bestätigen:

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

Die UID Ihres Kontos lautet wie folgt: uid=1000(saml)Die Standardgruppe ist git=1000(saml)und alle sekundären Gruppen sind danach.

HINWEIS: Wenn Sie möchten, dass der Git-Klon einen bestimmten Besitz hat, haben Sie mindestens zwei Optionen.

Option 1

Legen Sie ein übergeordnetes Verzeichnis mit den gewünschten Berechtigungen fest:

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

$ cd topdir
$ git clone ....

Dies zwang das Verzeichnis topdir, alle untergeordneten Verzeichnisse darunter zu erzwingen, damit die Gruppe httpangewendet wird. Dies funktioniert im Großen und Ganzen, kann jedoch zu Problemen führen, da beim Verschieben von Dateien in diesen Git-Klon-Arbeitsbereich die Gruppen dieser Dateien durch die oben vorgenommenen Änderungen nicht erzwungen werden.

Option 2

Ändern Sie vor der Arbeit Ihre Standardgruppe httpwie folgt:

$ newgrp http
$ git clone ...

Diese Methode erzwingt, dass für alle neu erstellten Dateien die Gruppe httpanstelle Ihrer normalen Standardgruppe festgelegt yuriwird. Dies funktioniert jedoch nur, solange Sie daran denken, newgrpvor der Arbeit in diesem Arbeitsbereich eine auszuführen.

Andere Optionen

Wenn beides nicht akzeptabel erscheint, können Sie versuchen, stattdessen ACLs im git-Arbeitsbereichsverzeichnis zu verwenden. Diese werden in mehreren Fragen und Antworten auf dieser Website erläutert, z. B. in den Fragen und Antworten mit dem Titel: Neue Dateien zum Erben von Gruppenberechtigungen unter Linux .

slm
quelle
Erstens müssen Sie meinen newgrp. Ändert es dann die Gruppe nur für die aktuelle Shell? Und schließlich ging es darum, nur bestimmte Dateien / Verzeichnisse für das Schreiben per Webserver zugänglich zu machen. Schließlich sollte ich sie wahrscheinlich manuell reparieren oder einen gitHaken aufstellen ...
x-yuri
@ x-yuri - ja, tut mir leid, es ist 5 Uhr morgens hier und ich gehe gleich ins Bett 8-). Ja, dies gilt nur für die aktuelle Shell. Dies wäre ein Nachteil dieses Ansatzes. Wenn Sie nur einen bestimmten Zugriff für den Webserver beabsichtigen, wird dies schwierig, und Sie möchten dann wahrscheinlich ACLs verwenden. Vielleicht möchten Sie diese Details auch zu Ihrem Q hinzufügen. Es ist unklar, was Ihr beabsichtigter Zweck ist, daher kann ich Ihnen nur in unspezifischen Begriffen antworten.
slm
1
@ x-yuri - ein Post-Update-Hook wie dieser ist möglicherweise passender: stackoverflow.com/questions/9613545/…
slm
1
@ x-yuri - Steuern von Berechtigungen wird im Git-Buch unter Hooks besprochen
slm
Ich sehe nicht wirklich, wie ein Gruppenwechsel nur für die aktuelle Shell ein Nachteil sein kann, um ehrlich zu sein. Ich war besorgt darüber, dass es die Funktionsweise der restlichen Apps nicht verändert.
X-Yuri
2

Die Lösung, die ich verwende, besteht darin , den Befehl als Benutzer auszuführen, der über die Berechtigungen verfügt, die Sie behalten möchten:

sudo -u user command

Dies verhindert, dass sich die Berechtigungen ändern. Ich verwende es, wenn ich Git-Repositorys auf meinem VPS aktualisiere, während die Dateiberechtigungen für den Webserver-Benutzer festgelegt bleiben.

Siehe auch die gleiche Frage hier .

Deleet
quelle