2010-12-09 15 views
2

Ich habe meine git Arbeitsstruktur wie folgt festgelegt (dank einer Empfehlung in einer anderen Frage git : Small project work)git Haken Erlaubnis Problem

/live/website 
     | 
     | 
/path/to/staging (bare) 
    |   | 
    |   | 
dev1  dev2 

Derzeit sind sowohl dev1 und dev2, drücken Sie die Projekte zum /path/to/staging repo. Ich habe einen Haken in/path/to/staging, der automatisch eine git pull von meiner/live/Website auslöst. Auf diese Weise habe ich eine Arbeitskopie von Dateien dort.

Auch /path/to/staging (bare) wurde mit share = 0777 initialisiert, so dass ich weiß, dass der Anteil kein Problem ist. Außerdem habe ich alle Dateien auf 777 CHMODded und setze auch das Stick-Bit.

Ich habe die/live/Website Repo als user : root erstellt. Allerdings habe ich den Repo in dev1 als user : dev1 erstellt. Ich kann Änderungen in dev1 fein machen, aber wenn ich versuche, den Repo von dev1 zu drücken, dann ist hier das Problem, das ich konfrontiert:

error: Couldn't set refs/remotes/origin/master 
From /path/to/staging 
! 8b4fddc2 .. e2a0b21 master  -> origin/master (unable to update local ref) 
To path/to/staging 
    8c5fddc2 .. e2a0b21 master -> master 

Und im Grunde, sehe ich nicht die Dateien erfolgreich auf/live/Website übertragen. Ich denke, dieses Problem tritt auf, da ich den Code als user : dev1 ausführe. Wenn ich jedoch zu /live/websit e blättern und eine git pull manuell als user : root mache, zieht es die von dev1 vorgenommenen Änderungen erfolgreich durch und ändert die Arbeitsdatei.

Kann jemand empfehlen, wenn es eine Möglichkeit gibt, dieses Problem zu umgehen? Da es der Zweck des automatischen Haken schlägt ...

Etwas anderes, dass ich zu tun dachte in dem Haken war, wurde ich zu denken, den Benutzer zu ändern:

su root 
password 

Allerdings, wenn es ausgeführt wird, ich glaube nicht, daß ich das Passwort an der Eingabeaufforderung eingegeben haben, da die Fehlermeldung erhalte ich ist:

hooks/post-receive: line 18: password: command not found 

EDIT,

Kann jemand auch einen Weg vorschlagen, von einem Stoß zurückzugehen? Und den vorherigen Stand der Dateien abrufen?

Antwort

1

AFAIK Sie können su kein Passwort in der Befehlszeile eingeben. Aber Sie können sudo verwenden, fügen Sie den zulässigen Benutzer in /etc/sudoersohne Kennwort hinzu, so dass Sie Ihren Befehl als sudo -u webside-user-name 'cd /live/website && git fetch && git checkout master' ausführen können.

+0

Rudi: Ich schaute auf diese Datei und es heißt, ich kann nur ändern, indem Sie Sudo Visudo tun. Wenn ich dies jedoch versuche und ausführe: 'sudo: visudo: Befehl nicht gefunden'. Mit der Bearbeitung habe ich also Probleme. In Bezug auf die Git-Verzeichnisstruktur, wissen Sie, warum ich Probleme habe, den Pull auszuführen? Ich meine, die '/ live/Website' ist ein gemeinsames Repository. Ich stellte sicher, dass ich es so gemacht habe, indem ich 'git repo-config core gemacht habe.sharedRepository true' – g1t

+0

Können Sie su in den root-Account und visudo dort ausführen? On debian visudo ist im sudo-Paket (http://packages.debian.org/lenny/i386/sudo/filelist) und lebt in/usr/sbin/visudo. – Rudi

+0

Was den '/ live/website' Teil betrifft: Haben Sie das '/ path/to/staging' Repo schon eingerichtet? Wenn ja, muss die '/ live/Website' ein nicht-bare Repo sein, da die Dateien dort erscheinen sollen. Ich schlage vor, den aktuellen '/ live/website' Pfad weg zu verschieben und ihn durch einen normalen Klon von'/live/website' zu ​​ersetzen. – Rudi

0

Ich verwende einen ähnlichen Workflow und ich habe nicht einmal Root-Zugriff auf dem Live-Webserver und es funktioniert immer noch gut. Hier ist das Skript Ich verwende (es ist ein Post erhalten Haken, ich nehme an, es könnte ein Post-Update Haken sein, anstatt aber ich habe nicht getestet, dass):

 
#!/bin/sh 
# To enable this hook, make this file executable by "chmod +x post-receive". 
GIT_WORK_TREE=/path/to/htdocs git checkout -f 

Dann können Sie den Haken testen, indem Sie Haken/Post-Empfang. Wenn es funktioniert, wenn Sie es manuell testen, sollte es funktionieren, wenn Sie "git push" ausführen