"fatal: kein Git-Repository: '.'", wenn der Hook nach dem Update verwendet wird, um 'Git Pull' auf einem anderen Repo auszuführen

89

Ich bin neu in Git, also entschuldige ich mich (und korrigiere mich bitte), wenn ich hier die Terminologie missbrauche, aber ich werde mein Bestes geben.

Ich versuche, ein Bare-Git-Repo (Hub) und eine Entwicklungskopie (Prime) auf einem Webserver einzurichten. Ich habe versucht, es nach diesem Artikel zu strukturieren . Ich möchte, dass die Entwicklungsarbeitskopie immer dann aktualisiert wird, wenn das Hub-Repo aufgeschoben wird. Ich habe den Eindruck, dass der richtige Haken dafür ist post-update, den ich so geschaffen habe:

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET

Aktualisieren

Wenn ich Änderungen von meinem lokalen Repo auf den Bare Hub übertrage, erhalte ich die folgende Ausgabe vom Post-Update-Skript:

remote: sites
remote: fatal: Not a git repository: '.'

Wenn ich jedoch als Benutzer-Sites auf den Server setze und dieses Skript manuell ausführe, funktioniert es hervorragend. Irgendwelche Ideen, was mit diesem Hook oder Skript möglicherweise schief geht?

Ty W.
quelle

Antworten:

179

Hier ist das Skript, das letztendlich funktioniert hat. Ich denke, das bisschen, das mir ursprünglich fehlte und das es daran hinderte, aus der Ferne zu arbeiten, war dasunset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info
Ty W.
quelle
18
Ich kann bestätigen, das Deaktivieren GIT_DIRbehebt das Problem.
jmtd
16
Für diejenigen, die das verstehen wollen, warum: Es liegt daran, dass Git die Variable GIT_DIRanstelle von verwendet PWD. cd-ing ändert das PWDnicht das GIT_DIR. Es muss einen Fallback in Git von GIT_DIRbis geben, PWDsollte der erste nicht verfügbar sein.
Zupa
Die Frage ist, warum git es für notwendig halten muss, dies für das Hook-Skript zu tun (setzen Sie GIT_DIR so, dass selbst das Skript an anderer Stelle 'cd' hat, git, was auch immer 'noch funktioniert)? Ich persönlich würde mich dafür entscheiden, dass Git diese Art von Magie nicht macht.
Steven Haryanto
2
Der Grund dafür ist, dass Git einige Umgebungsvariablen auf alle Kern-Git-Befehle anwendet .
Casey
Was passiert, wenn es danach zu einem Zusammenführungskonflikt kommt git pull?
lolololol ol
29

Versuchen Sie stattdessen:

#!/bin/sh
cd /path/to/working-copy/
env -i git pull
Geraldo Luis da Silva Ribeiro
quelle
0

Trotzdem funktioniert GIT_DIR einfach nicht.

Das Problem tritt auf, wenn Sie GIT_DIR an einer anderen Stelle falsch eingestellt haben.

Sie können stattdessen einfach Folgendes hinzufügen: GIT_DIR = .git / Es wird funktionieren

Zvika Naveh
quelle
0

In meinem Fall hatte ich einen Arbeitsbaum angegeben, der bei einigen Befehlen wie pull(oder genauer fetch) unterbrochen wird .

Um den Arbeitsbaum zu deaktivieren, wenn er sich in Ihrer Git-Konfiguration befindet, gehen Sie über:

git config --unset core.worktree

(Es gibt andere Möglichkeiten, einen Arbeitsbaum festzulegen.)

Wichtig zu beachten,

Es gibt so gut wie keine Änderung, dass dies Ihr Problem ist, es sei denn, Sie haben dieses Loch selbst mit einem benutzerdefinierten Arbeitsbaum gegraben.

Geplänkel:

Dies impliziert für mich, dass Git-Interna .git/in einigen Fällen Pfade relativ zum Arbeitsbaum + verwenden. Nach meiner Erfahrung werden Arbeitsbäume nur von den grundlegendsten Teilen von Git gut unterstützt. Ich habe nicht gründlich experimentiert, Git würde sich wahrscheinlich verhalten, wenn ich die Konfigurationsvariable für das Git-Verzeichnis richtig einstelle, mit der ich nicht gespielt habe.

ThorSummoner
quelle
-1

Sie haben wahrscheinlich ein Berechtigungsproblem. Ich bin nicht sicher, wie Sie Ihr Bare-Git-Repo eingerichtet haben, aber wenn es unter dem gitBenutzer ausgeführt wird, stellen Sie sicher, dass der gitBenutzer das git pullin Ihrem Projektverzeichnis ausführen darf .

Versuchen Sie dies optional, um herauszufinden, welcher Benutzer Sie sind, wenn der Hook ausgeführt wird:

echo `whoami`
Ariejan
quelle
Wenn ich als Git-Benutzer auf den Server ssh, kann ich Git Pull problemlos in meinem Projektverzeichnis verwenden. Ich glaube , das ist der Benutzer, der das Skript ausführen sollte. Ich kann versuchen, die whoami-Zeile zum Skript hinzuzufügen, aber wohin geht die Ausgabe dieses Skripts, wenn es als Hook ausgeführt wird? Vielleicht muss ich diese Ausgabe an eine Protokolldatei senden, anstatt sie zu wiederholen?
Ty W
Was macht echo `whoami`das whoaminicht?
Christoffer Hammarström
Die Ausgabe eines Hook-Skripts an stdout ist für die Remote-Aktion sichtbar, die die Aktion ausführt. Mit anderen Worten, wenn Sie "Git Push" sagen, wird die Ausgabe eines Hooks auf der Fernbedienung in Ihrem Standard angezeigt.
ebneter
Ja, das ist mir aufgefallen, als ich mit Sachen gespielt habe. sehr praktisch :)
Ty W