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:
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
# Clear the permissions database file
> $DATABASE
echo -n "Backing-up file permissions..."
IFSold=$IFS
IFS=$'\n'
for FILE in `git ls-files`
do
# Save the permissions of all the files in the index
echo $FILE";"`stat -c "%a;%U;%G" $FILE` >> $DATABASE
done
IFS=${IFSold}
# Add the permissions database file to the index
git add $DATABASE
echo "OK"
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:
$ cat .permissions
.gitignore;660;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.doc;664;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.pdf;664;pauljohn;pauljohn
Wie Sie sehen können, haben wir
filepath;perms;owner;group
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.
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
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
$ git checkout -- upload.sh
Restoring file permissions...chmod: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chmod: cannot access 'Notebook.onetoc2': No such file or directory
chown: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chown: cannot access 'Notebook.onetoc2': No such file or directory
Ich suche nach Lösungen dafür. Hier ist etwas, das zu funktionieren scheint, aber ich habe nur in einem Fall getestet
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
echo -n "Restoring file permissions..."
IFSold=${IFS}
IFS=$
while read -r LINE || [[ -n "$LINE" ]];
do
FILE=`echo $LINE | cut -d ";" -f 1`
PERMISSIONS=`echo $LINE | cut -d ";" -f 2`
USER=`echo $LINE | cut -d ";" -f 3`
GROUP=`echo $LINE | cut -d ";" -f 4`
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
done < $DATABASE
IFS=${IFSold}
echo "OK"
exit 0
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.