9 Stimmen

Wie kann man den Besitz von Dateien kontrollieren, die durch Commit-Hooks automatisch in ein Git-Ziel-Repositorium gepusht werden?

Ich habe ein Bare Repo erstellt @

/srv/repos/test

ich setze den Besitz auf wwwrun:www mit gesetzten SUID+GUID-Bits

chown -R wwwrun:www /srv/repos/hub
chmod ug+s          /srv/repos/hub
ls -ald /srv/repos/test
    drwsrws---+ 10 wwwrun www 4.0K Mar  7 21:28 /srv/repos/hub/

Ich habe das Repo in ein Webroot geklont und die Besitzverhältnisse geändert,

git clone /srv/repos/hub /srv/www/siteA
chown -R wwwrun:www      /srv/www/siteA

der Einfachheit halber definiere ich eine entfernte

cd /srv/www/siteA
git remote add HUB /srv/repos/hub

erstellen Sie dann Post-Commit- und Post-Update-Hooks, um die Dinge synchron zu halten,

vi /srv/www/siteA/.git/hooks/post-commit
    #!/bin/sh
    git push HUB

vi /srv/repos/hub/hooks/post-update
    #!/bin/sh
    cd /srv/www/siteA || exit
    unset GIT_DIR
    git pull HUB master
    exec git-update-server-info

als normaler Benutzer checke ich HUB aus

whoami
    locuse
cd ~
git clone /srv/repos/hub WORK
ls -ald WORK
    drwxr-xr-x 10 locuse users 4.0K Mar  7 21:44 WORK/

eine Änderung vornehmen, committen und pushen,

cd WORK
touch touch_file
ls -al touch_file
    -rw-r--r-- 1 locuse users 0 Mar  7 21:44 touch_file
git add -A
git commit -m "add test"
git push

und dann zu überprüfen, ob der Hook ausgelöst und das Update an die Webroot übertragen wurde,

ls -al /srv/www/siteA/touch_file
    -rw-rw----+ 1 locuse www 0 Mar  7 21:45 /srv/www/siteA/touch_file

die Datei ist da - wie erwartet.

aber es ist nicht die gewünschte Benutzerzugehörigkeit, nämlich user='locuse' und nicht user='wwwrun'.

Wie kann ich in diesem speziellen Anwendungsfall sicherstellen, dass ich immer automatisch mit INSTEAD landen würde?

ls -al /srv/www/siteA/touch_file
    -rw-rw----+ 1 wwwrun www 0 Mar  7 21:45 /srv/www/siteA/touch_file

? d.h. alles wird immer nach /srv/www/siteA verschoben nur als wwwrun:www .

etwas mit einem Haken, nehme ich an?

Ich weiß, ich könnte hinzufügen

chown -R wwwrun:www /srv/www/siteA

zum Post-Commit-Hook, was bei einem kleinen Baum gut funktioniert, aber bei jedem Commit/Update ins Stocken gerät, wenn er groß ist (was er sein wird).

wenn ich vielleicht nur den aktuellen Commit effizient chounten könnte ... ?

0 Stimmen

Bitte schreiben Sie die Lösung in eine Antwort. Zu gegebener Zeit können Sie die Antwort akzeptieren.

0 Stimmen

Zum Zeitpunkt der Bearbeitung war dies nicht möglich, da ich weitere 6 Stunden warten musste ...

6voto

Das funktioniert,

vi /srv/repos/hub/hooks/post-update
    #!/bin/sh
    cd /srv/www/siteA || exit
    unset GIT_DIR
-   git pull HUB master
+   git fetch HUB master
+   files=`git diff ..FETCH_HEAD --name-only --diff-filter=ACMRTUXB`
+   git merge FETCH_HEAD
+   for file in $files
+   do
+       sudo chown wwwrun:www $file
+   done
    exec git-update-server-info

chown führt nur die Dateien aus, die als Teil des Commit-Sets identifiziert wurden - klein und schnell.

1 Stimmen

Warum gibt es + und -?

0 Stimmen

@Schwarz - ist zum Entfernen von Zeilen, + ist zum Hinzufügen dieser Zeilen zur Datei. Es bedeutet "auf diese Weise bearbeiten".

2voto

user1810813 Punkte 21

Ich hatte ungefähr das gleiche Problem und nach einigen Recherchen habe ich herausgefunden, dass es keine Lösung gibt, wenn man das bloße (HUB) Repository über SSH aktualisiert, da die Hooks von dem Benutzer ausgeführt werden, der sich mit dem HUB-Repository verbunden hat (in unserem Fall git). Wenn Sie es vermeiden wollen, dem Git-Benutzer chown/chmod-Rechte zu geben (Sicherheitsproblem), besteht die einzige Lösung darin, einen Cron-Job zu erstellen, der das Repository aktualisiert. Ich habe dieses Skript (mein erstes Bash-Skript) erstellt, indem ich das alte Skript modifiziert und auch eine E-Mail-Benachrichtigung bei erfolgreicher Aktualisierung hinzugefügt habe:

#!/bin/sh
# web repository directory
REPO_DIR="/srv/www/siteA"
# remote repository 
REMOTE_REPO="HUB"
# public branch of the remote repository (only this branch well be public accessible trough the web server)
REMOTE_REPO_BRANCH="master"
# email address where receive notification
EMAIL_TO="your@email.com"
# sender email address and name
SENDER_ADDR="sender@email.com"
SENDER_NAME="sender name"
# tmp file that contain email body
TMP_MSG_FILE="emailmessage.txt"

cd $REPO_DIR || exit
unset GIT_DIR
echo "fetching changes..."
git fetch $REMOTE_REPO $REMOTE_REPO_BRANCH
files=`git diff ..FETCH_HEAD --name-only --diff-filter=ACDMRTUXB`
if [[ -n $files ]]; then
echo "changes found for the following file:"
echo ${files[*]}
echo "merging changes"
git merge FETCH_HEAD
echo "sending email"
SUBJECT="GIT: Web Directory Updated"
TMP_MSG_FILE="emailmessage.txt"
echo "following file are been updated/created/deleted: "> $TMP_MSG_FILE
echo ${files[*]} >>$TMP_MSG_FILE
echo "Working directory:" >>$TMP_MSG_FILE
echo "$repo_dir" >>$TMP_MSG_FILE
mutt -e "unmy_hdr from; my_hdr From: $SENDER_ADDR" -e "set realname='$SENDER_NAME' " -s "$SUBJECT" $EMAIL_TO < $TMP_MSG_FILE
else
echo "no changes found"
fi

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X