Für den Fall, dass Sie gerade jetzt kommen, ich habe es gerade durchgemacht und kann zusammenfassen, wo das steht. Wenn Sie dies noch nicht versucht haben, könnten einige Details hier helfen.
Ich denke @Omid Ariyan Ansatz ist der beste Weg. Fügen Sie die Skripts vor und nach der Überprüfung hinzu. Vergessen Sie NICHT, sie genau so zu benennen wie Omid und vergessen Sie nicht, sie ausführbar zu machen. Wenn Sie eines davon vergessen, haben sie keine Wirkung und Sie lassen "git commit" immer wieder laufen und fragen sich, warum nichts passiert :) Wenn Sie aus dem Webbrowser ausschneiden und einfügen, achten Sie darauf, dass die Anführungszeichen und Ticks nicht sind verändert.
Wenn Sie das Vorab-Commit-Skript einmal ausführen (indem Sie einen Git-Commit ausführen), wird die Datei .permissions erstellt. Sie können es dem Repository hinzufügen und ich denke, es ist nicht notwendig, es am Ende des Vorab-Commits-Skripts immer wieder hinzuzufügen. Aber es tut nicht weh, denke ich (hoffe).
Es gibt ein paar 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-Update. Für die Aufzeichnung dieses Skript pre-commit richtig für mich arbeiten:
#!/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"
Nun, was wir daraus herauskommen?
Die Datei .permissions befindet sich auf der obersten Ebene des Git Repos. Es hat eine Zeile pro Datei, hier ist die Spitze von meinem Beispiel:
$ 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, wir
filepath;perms;owner;group
In den Kommentaren zu diesem Ansatz haben, einer des Plakats beklagt, dass es funktioniert nur mit demselben Benutzernamen, und das ist technisch wahr, aber es ist sehr einfach, es zu beheben. Beachten Sie die Post-Kasse Skript 2 Aktion Stücke hat,
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
So bin ich nur die erste zu halten, das ist alles, was ich brauche. Mein Benutzername auf dem Web-Server ist in der Tat anders, aber was noch wichtiger ist, Sie können Chown nicht ausführen, wenn Sie root sind. Kann "chgrp" jedoch ausführen. Es ist klar genug, wie man das verwenden kann.
In der ersten Antwort in diesem Post, die am weitesten akzeptiert wird, ist der Vorschlag, so git-cache-meta, ein Skript, das die gleiche Arbeit macht, die die Pre/Post-Hook-Skripte hier tun (Analyseausgabe von git ls-files
). Diese Skripte sind für mich einfacher zu verstehen, der Git-Cache-Meta-Code ist etwas aufwendiger. Es ist möglich, git-cache-meta im Pfad zu belassen und Skripts für die Vorab-Commits und Post-Checkouts zu schreiben, die es verwenden würden.
Leerzeichen in Dateinamen sind ein Problem mit beiden Skripten von Omid. In der Post-Checkout-Skript, wissen Sie, Sie die Leerzeichen in Dateinamen, wenn Sie Fehler wie diese 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 auf Lösungen für die ich überprüft. Hier ist etwas, das scheint zu funktionieren, aber ich habe nur in einem Fall
#!/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 sind eine Zeile zu einem Zeitpunkt getestet, habe ich IFS auf $, so dass nur Zeilenumbrüche werden als neue Dinge gesehen.
Ich habe gelesen, dass es sehr wichtig ist, die IFS-Umgebungsvariable zurückzusetzen, wie es war! Sie können sehen, warum eine Shell-Session schlecht läuft, wenn Sie $ als einziges Trennzeichen beibehalten.
möglich Duplikat [git - wie die Dateiberechtigungen git wiederherstellen denkt, dass die Datei enthalten sein sollte?] (Http://stackoverflow.com/questions/2517339/git-how-to-recover- the-file-permissions-git-thinks-the-file-sollte-sein) – kennytm
Yeah rate so, obwohl die Lösung, auf die sie hinweisen, mir ehrlich gesagt nicht sicher ist, was ich damit anfangen soll. Hatte auf einen geradlinigeren Ansatz gehofft. – Yarin
Wie sieht es mit der Situation aus, in der der Quellcode aus einer Entwicklungsumgebung stammt (z. B. Windows - XAMPP usw.), die keine Dateieigentümerinformationen hat? Dateien am Ende des Git-Prozesses müssen dem Besitz und den Berechtigungen für den Zielspeicherort entsprechen. Kann git-cache-meta damit umgehen? Stimme mit Yarin ... sicherlich ist das ein ziemlich Mainstream-Anwendungsfall, der eine ziemlich einfache Lösung haben sollte? – user3600150