Die grundlegende Einrichtung unseres Git-Workflows ist ein reines Repository auf einem lokalen Netzwerkserver, auf das zwei Entwickler pushen/pullen.
Wir möchten jeden Zweig, der an einen anderen Ort auf unserem lokalen Netzwerkserver gepusht wird, automatisch kopieren (auschecken). Veranschaulichen:
Durch Pushen des „develop“-Zweigs werden Kopien in den „develop“-Unterordner kopiert. Durch Pushen des „Master“-Zweigs werden Kopien in den „Master“-Unterordner verschoben.
Das Problem, das wir haben, ist, den Post-Receive-Hook dazu zu bringen. Hier ist, was wir derzeit haben:
#!/bin/bash
while read oldrev newrev ref
do
branch=`echo $ref | cut -d/ -f3`
if [ "master" == "$branch" ]; then
GIT_WORK_TREE=/master
git checkout -f $branch
echo 'Changes pushed master.'
fi
if [ "develop" == "$branch" ]; then
GIT_WORK_TREE=/develop
git checkout -f $branch
echo 'Changes pushed to develop.'
fi
done
Der erhaltene Fehler ist:
‘remote: fatal: Dieser Vorgang muss in einem Arbeitsbaum ausgeführt werden. remote: Zur Entwicklung gedrängte Änderungen.’
Wie Sie es von diesem Fehler erwarten würden, wird tatsächlich nichts ausgecheckt.
Ich hatte auch den Post-Receive auf diese Weise versucht, aber das gleiche Problem:
#!/bin/bash
while read oldrev newrev ref
do
branch=`echo $ref | cut -d/ -f3`
if [ "master" == "$branch" ]; then
git --work-tree=/master checkout -f $branch
echo 'Changes pushed master.'
fi
if [ "develop" == "$branch" ]; then
git --work-tree=/develop checkout -f $branch
echo 'Changes pushed to develop.'
fi
done
Kann mir jemand erklären, was ich hier falsch mache (erklären Sie es gerne so, wie Sie es einem 3-Jährigen tun würden :)). Danke.
Um die Antwort für zukünftige Leser klarer zu machen, traf Torek auf den Kopf. Ich benutzte --work-tree=/master
um zu versuchen, zu einem Ordner namens “Master” im Stammverzeichnis meines Bare-Repos zu gelangen (z. B. neben “Branches”, “Hooks” usw.). Sobald ich dies umgestellt habe --work-tree=./master
(beachten Sie den Punkt vor dem Schrägstrich) alles funktionierte wie erwartet.