Git - Post-Receive-Hook mit Git-Pull "Es konnte kein gültiges Git-Verzeichnis gefunden werden"

17

Es ist sehr seltsam, aber wenn Sie ein Git-Repository einrichten und einen Post-Receive-Hook erstellen mit:

echo "--initializing hook--"
cd ~/websites/testing
echo "--prepare update--"
git pull
echo "--update completed--"

Der Haken läuft zwar, aber es gelingt ihm nie, Git Pull richtig auszuführen:

6bfa32c..71c3d2a  master -> master
--initializing hook--
--prepare update--
fatal: Not a git repository: '.'
Failed to find a valid git directory.
--update completed--

also frage ich mich jetzt, wie es möglich ist, dass der Hook den Klon mit post-receive aktualisiert?

In diesem Fall ist der Benutzer, der die Prozesse ausführt, derselbe und alles im Benutzerordner, daher verstehe ich das wirklich nicht

cd ~/websites/testing
git pull

es funktioniert problemlos ...

Jede Hilfe dazu wäre sehr dankbar

Danke vielmals

zanona
quelle

Antworten:

25

Während der Hook läuft, werden GIT_DIRund (wenn der Worktree explizit definiert wurde) GIT_WORK_TREEgesetzt. Das bedeutet, dass Ihr Pull nicht mit dem zweiten Repository in dem Verzeichnis ausgeführt wird, in das Sie gewechselt haben.

Versuchen git --git-dir ~/websites/testing/.git --work-tree ~/websites/testing pull; oder deaktiviere die repo-lokale Umgebung von git mit diesem Befehl:

unset $(git rev-parse --local-env-vars)

Weitere Informationen zu diesen Umgebungsvariablen in man 1 git .

Tobu
quelle
1
Vielen Dank für das Tobu, es funktioniert wirklich, ich werde auch mehr Informationen darüber nachlesen. Cheers
zanona
6

Eine Sache, die ich erlebte, war, dass die Verwendung des post-updateHakens '--git-dir' großartig funktionierte, aber git beschwerte sich immer noch über einen fehlenden Arbeitsbaum (trotz der Verwendung von '--work-tree')

Kurz gesagt, das hat nicht funktioniert:

git --git-dir /path/to/websites/testing/.git --work-tree /path/to/websites/testing pull

in der Erwägung, dass dies funktioniert hat:

cd /path/to/websites/testing
git --git-dir /path/to/websites/testing/.git pull


quelle
1

Funktioniert das nicht

cd /home/smb/websites/testing
env -i git pull

Bearbeitet

Besser noch

cd /home/smb/websites/testing
unset GIT_DIR
git pull
tommasop
quelle
0

Hast du es mit dem vollen Pfad anstatt mit dem ~ versucht?

cd /home/smb/websites/testing
git pull
die Seide
quelle
0

Das Skript wird wahrscheinlich mit aufgerufen /bin/sh, was nicht versteht ~. Versuchen Sie es ~stattdessen mit dem vollständigen Pfad zu .

Darren Chamberlain
quelle
0

Die erste empfohlene Antwort ist richtig - wenn ein Hook läuft, werden GIT_DIR usw. gesetzt. Wenn Sie das Skript jedoch in einem anderen Repository verwenden möchten, ist diese Methode fehlerhaft, da sie das Zurücksetzen von GIT_DIR fest codiert. Wie sie angedeutet haben, besteht die andere Möglichkeit darin, die Variable mithilfe von env wie folgt zu entfernen: env -i git reset --hard Welcher Befehl Sie dort ausführen, liegt ganz bei Ihnen - es ist nur das Bit 'env -i', das wichtig ist .


quelle