Git ändert meine Dateiberechtigungen beim Auschecken

Lesezeit: 4 Minuten

Git andert meine Dateiberechtigungen beim Auschecken
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

1644315606 175 Git andert meine Dateiberechtigungen beim Auschecken
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:

.git/hooks/post-checkout:

#!/bin/sh
chmod +x  tools/*

Ü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;)

#!/bin/sh
chmod a+x tools/fixpermissions.sh
tools/fixpermissions.sh

  • 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:

git show HEAD:./file.xml > ./file.xml

Setzt einfach den Inhalt zurück.

Git andert meine Dateiberechtigungen beim Auschecken
andrepo

Alternativ können Sie eine Standardberechtigung für den betreffenden Ordner wie folgt festlegen: https://unix.stackexchange.com/questions/1314/how-to-set-default-file-permissions-for-all-folders-files-in-a-directory

.

821420cookie-checkGit ändert meine Dateiberechtigungen beim Auschecken

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy