Git ändert meine Dateiberechtigungen beim Auschecken
Lesezeit: 4 Minuten
Schiro
Unser Workflow wird auf einem lokalen Computer entwickelt, die Änderungen in ein zentrales Repository übertragen und dann den Zweig dieses Repositorys überprüft, den wir benötigen.
Das Problem ist, dass Git den Besitz und sogar die Dateiberechtigungen der Dateien ändert, die es auscheckt, je nachdem, welcher Benutzer das Auschecken vornimmt. Eine direkte Folge davon ist, dass unsere CSS-Dateien nach einem Checkout unlesbar werden, da Git den Dateibesitz auf die Person ändert, die den Git-Pull im Webroot durchgeführt hat.
Beispiel:
Vor git pull: style.css gehört user_a:group_a
Nach git pull: style.css gehört user_b:user_b
Ich möchte das Eigentum behalten als user_a:group_a. Ich möchte mich nicht jedes Mal anmelden müssen, wenn ein Mitglied meines Teams eine Änderung an den Dateien vorgenommen hat, und den Besitz wieder auf die ursprüngliche Konfiguration zurücksetzen.
Wie gehen andere damit um? Wie gehen Sie mit Repositories um, die von mehreren Benutzern verwendet werden? Wir haben suphp auf unserem System und können es nicht entfernen.
stackoverflow.com/questions/2517339/…
– wojciii
28. Januar 13 um 7:13 Uhr
Ein mögliches Duplikat von Git ändert die Berechtigungen meiner Datei, wenn ich auf den Server pushe
– eis
28. Januar 13 um 7:14 Uhr
Git ist kein Bereitstellungstool. Dies liegt daran, dass keine vollständigen Berechtigungen gespeichert werden. Verwenden Sie ein geeignetes Bereitstellungstool, das Dinge wie das Festlegen von Berechtigungen unterstützt.
– Ikke
28. Januar 13 um 7:21 Uhr
eis
Git ändert keine Dateiberechtigungen oder Eigentumsrechte. Es ist nur so, dass es (meistens) auch nicht gespeichert wird, es existiert nicht in Ihrem Repo, also werden sie auf das geändert, was Ihr Benutzer hat. Genau wie bei jeder Dateierstellung.
Git unterstützt zwei Berechtigungssätze: ausführbares Bit an und ausführbares Bit aus. Nichts anderes. Eigentumsinformationen werden überhaupt nicht gespeichert.
Siehe diesen Thread – “Wenn Sie bestimmte Berechtigungen wünschen, müssen Sie dies manuell tun.”
Es gibt einige vorgeschlagene Lösungen: Sie können ein separates Tool verwenden, um dies für Sie zu tun, eine geeignete Kombination aus Benutzerkonto und umask verwenden, um sie standardmäßig richtig einzustellen, oder selbst einen Git-Hook schreiben, um dies zu tun. Auf dem Benutzer, der den Checkout durchführt, müsste ein Hook installiert werden.
Wie @ikke in den Kommentaren sagte, ist Git nicht wirklich ein Bereitstellungstool und sollte nicht als solches verwendet werden. Es ist ein Versionskontrollsystem für Quellcode.
Was empfehlen Sie für eine Bereitstellungsmethode? Alles, was keine Anmeldung für Dienste von Drittanbietern erfordert? scp mit symlinks?
– Nullen und Einsen
23. Januar 17 um 20:04 Uhr
@Nullen und Einsen Nun, es hängt davon ab, was Sie bereitstellen. entweder durch Skripting: Ansible, Salt, Capistrano, Dandelion … oder ein CI-Tool wie Gocd, Jenkins, Deploybot, Buildbot, Bamboo oder ähnliches. oder Maven-Werkzeuge auslösen, oder oder. Je nach Anwendungsfall gibt es viele Optionen.
– eis
23. Januar 17 um 20:44 Uhr
Vielen Dank! Bereitstellung von Web-Apps, hauptsächlich Lampenstacks. habe gerade angefangen, mich mit ansible via zu befassen deploy.serverforhackers.com als Ressource. Wie Sie bereits erwähnt haben, gibt es so viele Namen da draußen, dass man kaum weiß, wo man anfangen soll.
– Nullen und Einsen
23. Januar 17 um 20:57 Uhr
Für mich war die beste Lösung die Erstellung eines Shell-Skripts, das die Berechtigungen festlegt. Beispielsweise:
Übrigens, das Auschecken ist nicht der einzige Fall, in dem Git mit Berechtigungen herumspielt, sondern auch, wenn Sie ziehen. Ich handhabe das mit .git/hooks/post-merge Haken.
Idealerweise können Sie ein Shell-Skript erstellen, das Berechtigungen irgendwo in Ihrem Repo festlegt (z tools/fixpermissions.sh) und rufen Sie es in beiden Hooks auf. Vergessen Sie nicht, die Berechtigungen für diese Datei manuell zu ändern;)
Der Nachteil dabei ist, dass Hooks nicht Teil des Repos sind und daher manuell erstellt werden müssen. Es ist jedoch möglich, den Hook-Setup-Aufwand wie hier beschrieben zu minimieren: stackoverflow.com/questions/3462955/…
– tischma
15. August 13 um 12:50 Uhr
Außerdem musste ich den Hook ausführbar machen, indem ich Folgendes ausführte: chmod ug+x .git/hooks/post-merge
– Robert Lujo
11. April 14 um 15:26 Uhr
Da Sie nur das ausführbare Bit hinzufügen, können Sie diese Informationen tatsächlich in Git speichern.
– eis
20. April 16 um 10:40 Uhr
@eis kannst du nicht, weil .git dir selbst nicht unter git ist.
– tischma
26. August 16 um 8:50 Uhr
@ArthurAraújo Post-Receive-Hook wird auf dem Server ausgeführt, nachdem ein Push empfangen wurde, sodass er definitiv nicht auf das fragliche Problem zutrifft.
– tischma
26. August 16 um 08:53 Uhr
Die einfachste Lösung besteht darin, git einfach als auszuführen user_a.
Ich laufe oft a
git checkout -f file.xml
… auf einer versionierten Datei.xml mit World-Write-Rechten, da ich es ständig ändere und es in den normalen Zustand zurückversetzen möchte.
Aber das setzt die Berechtigungen zurück. Eine etwas längere Version:
stackoverflow.com/questions/2517339/…
– wojciii
28. Januar 13 um 7:13 Uhr
Ein mögliches Duplikat von Git ändert die Berechtigungen meiner Datei, wenn ich auf den Server pushe
– eis
28. Januar 13 um 7:14 Uhr
Git ist kein Bereitstellungstool. Dies liegt daran, dass keine vollständigen Berechtigungen gespeichert werden. Verwenden Sie ein geeignetes Bereitstellungstool, das Dinge wie das Festlegen von Berechtigungen unterstützt.
– Ikke
28. Januar 13 um 7:21 Uhr