Ich möchte die Versionskontrolle meines Webservers wie unter Versionskontrolle für meinen Webserver beschrieben durchführen , indem ich aus meinem ein Git-Repo erstelle /var/www directory
. Meine Hoffnung war, dass ich dann Webinhalte von unserem Entwicklungsserver auf Github übertragen, auf unseren Produktionsserver ziehen und den Rest des Tages am Pool verbringen kann.
Anscheinend ist ein Knick in meinem Plan, dass Git die Dateiberechtigungen nicht respektiert (ich habe es nicht ausprobiert, sondern erst jetzt darüber gelesen). Ich denke, dies ist insofern sinnvoll, als verschiedene Boxen unterschiedliche Benutzer- / Gruppen-Setups haben können. Wenn ich jedoch die Weitergabe von Berechtigungen erzwingen wollte und weiß, dass meine Server gleich konfiguriert sind, habe ich dann Optionen? Oder gibt es eine einfachere Möglichkeit, sich dem zu nähern, was ich versuche?
quelle
Antworten:
Die
git-cache-meta
in SO erwähnte Frage " git - wie kann man die Dateiberechtigungen wiederherstellen, die git für die Datei hält? " (Und die git-FAQ ) ist der geradlinigere Ansatz.Die Idee ist,
.git_cache_meta
die Berechtigungen der Dateien und Verzeichnisse in einer Datei zu speichern .Es ist eine separate Datei, die nicht direkt im Git-Repo versioniert ist.
Deshalb ist die Verwendung dafür:
Also du:
quelle
git ls-files
.Git ist ein Versionskontrollsystem, das für die Softwareentwicklung entwickelt wurde. Aus allen Modi und Berechtigungen werden also nur ausführbare Bits (für normale Dateien) und Symlink-Bits gespeichert. Wenn Sie vollständige Berechtigungen speichern möchten, benötigen Sie Tools von Drittanbietern wie
git-cache-meta
( von VonC erwähnt ) oder Metastore (von etckeeper verwendet ). Oder Sie können IsiSetup verwenden , das IIRC git als Backend verwendet.Siehe Seite Schnittstellen, Frontends und Tools im Git-Wiki.
quelle
/usr/share/git-core/contrib/hooks/setgitperms.perl
in meinemgit-contrib
Paket ein Skript für einen ähnlichen Zweck gefunden. ("Dieses Skript kann verwendet werden, um vollständige Berechtigungen undDies ist ziemlich spät, könnte aber einigen anderen helfen. Ich mache, was du willst, indem ich meinem Repository zwei Git-Hooks hinzufüge.
.git / hooks / pre-commit:
.git / hooks / post-checkout:
Der erste Hook wird aufgerufen, wenn Sie "festschreiben". Er liest den Besitz und die Berechtigungen für alle Dateien im Repository und speichert sie in einer Datei im Stammverzeichnis des Repositorys mit dem Namen .permissions. Fügen Sie dann die .permissions-Datei zum Festschreiben hinzu.
Der zweite Hook wird beim "Auschecken" aufgerufen und durchsucht die Liste der Dateien in der .permissions-Datei und stellt den Besitz und die Berechtigungen dieser Dateien wieder her.
quelle
$SELF_DIR/../../
ist nicht unbedingt die Wurzel des Repositorys ... aber esgit rev-parse --show-toplevel
ist. (Nicht sicher, warum Sie nicht nurpwd
für das aktuelle Verzeichnis verwenden würden, aber das ist sowiesoIFS=$'\n'
vor derfor
Schleife festlegen , dass dies gestoppt wird (undunset IFS
danach, um sicher zu gehen).chmod 0600 .pgpass
inpost-checkout
. Ja, ich muss es manuell aktualisieren, wenn ich eine Datei habe, die bestimmte Berechtigungen benötigt, aber das sind die Unterbrechungen.Für den Fall, dass Sie gerade darauf eingehen, habe ich es heute gerade durchgemacht und kann zusammenfassen, wo dies steht. Wenn Sie dies noch nicht versucht haben, können einige Details hier hilfreich sein.
Ich denke, @Omid Ariyans Ansatz ist der beste Weg. Fügen Sie die Skripte vor dem Festschreiben und nach dem Auschecken hinzu. Vergessen Sie nicht, sie genau so zu benennen, wie Omid es tut, und vergessen Sie nicht, sie ausführbar zu machen. Wenn Sie eines davon vergessen, haben sie keine Auswirkung und Sie führen immer wieder "git commit" aus und fragen sich, warum nichts passiert :) Achten Sie auch beim Ausschneiden und Einfügen aus dem Webbrowser darauf, dass die Anführungszeichen und Häkchen nicht vorhanden sind verändert.
Wenn Sie das Pre-Commit-Skript einmal ausführen (indem Sie ein Git-Commit ausführen), wird die Datei .permissions erstellt. Sie können es dem Repository hinzufügen, und ich denke, es ist nicht erforderlich, es am Ende des Pre-Commit-Skripts immer wieder hinzuzufügen. Aber es tut nicht weh, denke ich (Hoffnung).
Es gibt einige kleine Probleme mit dem Verzeichnisnamen und dem Vorhandensein von Leerzeichen in den Dateinamen in Omids Skripten. Die Leerzeichen waren hier ein Problem und ich hatte einige Probleme mit dem IFS-Fix. Für die Aufzeichnung hat dieses Pre-Commit-Skript für mich korrekt funktioniert:
Was haben wir davon?
Die .permissions-Datei befindet sich in der obersten Ebene des Git-Repos. Es hat eine Zeile pro Datei, hier ist der Anfang meines Beispiels:
Wie Sie sehen können, haben wir
In den Kommentaren zu diesem Ansatz beschwert sich eines der Poster, dass es nur mit demselben Benutzernamen funktioniert, und das ist technisch richtig, aber es ist sehr einfach, es zu beheben. Beachten Sie, dass das Post-Checkout-Skript zwei Aktionselemente enthält.
Also behalte ich nur den ersten, das ist alles was ich brauche. Mein Benutzername auf dem Webserver ist zwar anders, aber was noch wichtiger ist, Sie können chown nur ausführen, wenn Sie root sind. Kann jedoch "chgrp" ausführen. Es ist klar genug, wie man das benutzt.
In der ersten Antwort in diesem Beitrag, die am weitesten verbreitet ist, wird vorgeschlagen, git-cache-meta zu verwenden, ein Skript, das die gleiche Arbeit leistet wie die Pre / Post-Hook-Skripte hier (Analyse der Ausgabe von
git ls-files
). . Diese Skripte sind für mich leichter zu verstehen, der Git-Cache-Meta-Code ist etwas ausgefeilter. Es ist möglich, Git-Cache-Meta im Pfad zu belassen und Skripte vor dem Festschreiben und nach dem Auschecken zu schreiben, die es verwenden würden.Leerzeichen in Dateinamen sind bei beiden Omid-Skripten ein Problem. Im Post-Checkout-Skript wissen Sie, dass Sie die Leerzeichen in Dateinamen haben, wenn Sie solche Fehler sehen
Ich suche nach Lösungen dafür. Hier ist etwas, das zu funktionieren scheint, aber ich habe nur in einem Fall getestet
Da die Berechtigungsinformationen jeweils eine Zeile umfassen, setze ich IFS auf $, sodass nur Zeilenumbrüche als neue Dinge angesehen werden.
Ich habe gelesen, dass es SEHR WICHTIG ist, die IFS-Umgebungsvariable wieder so zu setzen, wie sie war! Sie können sehen, warum eine Shell-Sitzung möglicherweise schlecht verläuft, wenn Sie $ als einziges Trennzeichen belassen.
quelle
Wir können die anderen Antworten verbessern, indem wir das Format der
.permissions
Datei in ausführbarechmod
Anweisungen ändern und den-printf
Parameter to verwendenfind
. Hier ist die einfachere.git/hooks/pre-commit
Datei:... und hier ist die vereinfachte
.git/hooks/post-checkout
Datei:Denken Sie daran, dass andere Tools diese Skripts möglicherweise bereits konfiguriert haben, sodass Sie sie möglicherweise zusammenführen müssen. Hier ist beispielsweise ein
post-checkout
Skript, das auch die folgendengit-lfs
Befehle enthält:quelle
Beim Pre-Commit / Post-Checkout besteht die Option darin, das Dienstprogramm "mtree" (FreeBSD) oder "fmtree" (Ubuntu) zu verwenden, das "eine Dateihierarchie mit einer Spezifikation vergleicht, eine Spezifikation für eine Dateihierarchie erstellt oder a ändert Spezifikation."
Die Standardeinstellungen sind Flags, GID, Link, Modus, N-Link, Größe, Zeit, Typ und UID. Dies kann mit dem Schalter -k an den jeweiligen Zweck angepasst werden.
quelle
Ich verwende FreeBSD 11.1. Das Virtualisierungskonzept von freebsd jail macht das Betriebssystem optimal. Die aktuelle Version von Git, die ich verwende, ist 2.15.1. Ich bevorzuge es auch, alles auf Shell-Skripten auszuführen. In diesem Sinne habe ich die obigen Vorschläge wie folgt geändert:
git push: .git / hooks / pre-commit
Git Pull: .git / Hooks / Post-Merge
Wenn Sie das Skript aus irgendeinem Grund neu erstellen müssen, sollte die Ausgabe der .permissions-Datei das folgende Format haben:
Für eine Gitignore-Datei mit 644 Berechtigungen für root: rad
Beachten Sie, dass ich einige Änderungen an den Statistikoptionen vornehmen musste.
Genießen,
quelle
Eine Ergänzung zu @Omid Ariyans Antwort sind Berechtigungen für Verzeichnisse. Fügen Sie dies nach der
for
Schleifedone
in seinempre-commit
Skript hinzu.Dadurch werden auch Verzeichnisberechtigungen gespeichert.
quelle