Angenommen, ich habe ein Verzeichnis, /X/Y
bei dem es sich um ein Git-Repository handelt. Ist es möglich, einen Befehl wie git pull
von innen aufzurufen /X
, aber auf das /X/Y
Verzeichnis abzuzielen ?
EDIT: Ich glaube, ich habe mich speziell gefragt: Ist es möglich, dies mit dem Befehl a git zu tun, ohne die Verzeichnisse ändern zu müssen?
HINWEIS: Ich habe die Antwort von VonC akzeptiert , da sie viel eleganter ist als die vorherigen Optionen. Für Leute, die Git älter als 1.8.5 ausführen, lesen Sie bitte die Antwort von bstpierre unten .
Antworten:
Ab Git 1.8.5 (Q4 2013) können Sie "einen Git-Befehl verwenden, ohne jedoch die Verzeichnisse wechseln zu müssen".
Siehe Commit 44e1e4 von Nazri Ramliy :
Seit Git 2.3.4 (März 2015), und verpflichten 6a536e2 von Karthik Nayak (
KarthikNayak
) ,git
behandeln wird "git -C '<path>'
" als no-op , wenn<path>
leer.4 Jahre später dokumentiert Git 2.23 (Q3 2019), dass '
git -C ""
' funktioniert und das Verzeichnis nicht wechseltDas heißt, die Dokumentation enthält jetzt (endlich):
Sie können
git -C
als Beispiel die Verwendung mit Git 2.26 (Q1 2020) sehen.Sehen Sie verpflichten b441717 , begehen 9291e63 , begehen 5236fce , begehen 10812c2 , begehen 62d58cd , begehen b87b02c , begehen 9b92070 , begehen 3595d10 , begehen f511bc0 , begehen f6041ab , begehen f46c243 , begehen 99c049b , begehen 3.738.439 , begehen 7.717.242 , begehen b8afb90 (20. Dezember 2019) von Denton Liu (
Denton-L
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 381e8e9 , 05. Februar 2020)quelle
apt-get install software-properties-common python-software-properties
dann füge das Git Repo hinzuadd-apt-repository ppa:git-core/ppa
. Der letzte Schritt ist das Aktualisieren von git :apt-get update && apt-get upgrade
.Bearbeiten :
Es gibt entweder einen Fehler mit
git pull
oder Sie können nicht das tun, was Sie mit diesem Befehl versuchen. Sie können dies jedoch mit Abrufen und Zusammenführen tun:Ursprüngliche Antwort :
Angenommen, Sie führen Bash oder ähnliches aus, können Sie dies tun
(cd /X/Y; git pull)
.Die Git-Manpage gibt einige Variablen an (siehe "Das Git-Repository"), die helfen sollen, aber ich kann sie nicht richtig funktionieren lassen (mit meinem Repository in / tmp / ggg2):
Wenn Sie den folgenden Befehl ausführen, während mein cwd / tmp ist, wird das Repo aktualisiert, aber die aktualisierte Datei wird in / tmp anstelle des Arbeitsbaums / tmp / ggg2 angezeigt:
Siehe auch diese Antwort auf eine ähnliche Frage , die die
--git-dir
und--work-tree
-Flaggen demonstriert .quelle
.git
Verzeichnis nicht finden .git --git-dir=/tmp/ggg2/.git --work-tree=/tmp/ggg2 pull
Fall wird eine Fehlermeldung angezeigt. Wenn ich dies jedoch tue,git --git-dir=/tmp/ggg2/.git --work-tree=. pull
während ich in / tmp bin, werden die aktualisierten Dateien wie gewünscht in / tmp abgelegt.--work-tree
jetzt , wie--work-tree=/tmp/ggg2/
und--work-tree=/tmp/ggg2/.
da könnte es ein Problem mit , wie es der Pfad Parsen.Sie können es in ein Bash-Skript oder einen Git-Alias einbinden:
quelle
pushd/popd
Paar anstelle voncd/cd-
(cd xyz && git pull)
Dieser Beitrag ist ein bisschen alt, also könnte es einen Fehler geben und er wurde behoben, aber ich habe dies einfach getan:
Und es hat funktioniert. Ich habe eine Minute gebraucht, um herauszufinden, dass die Punktdatei und das übergeordnete Verzeichnis benötigt werden (in einem Standard-Setup sind dies immer Eltern / Kind, aber nicht in ALLEN Setups, daher müssen sie explizit angegeben werden.
quelle
Da sich einige meiner Server auf einer alten Ubuntu LTS-Version befinden, kann ich git nicht einfach auf die neueste Version aktualisieren (die die Option -C unterstützt, wie in einigen Antworten beschrieben).
Dieser Trick funktioniert gut für mich, insbesondere weil er nicht die Nebenwirkung einiger anderer Antworten hat, die Sie in einem anderen Verzeichnis belassen, als Sie begonnen haben.
Oder als Einzeiler:
Sowohl Linux als auch Windows verfügen über Pushd- und Popd-Befehle.
quelle
Mit Kombination
pushd
,git pull
undpopd
wir diese Funktionalität erreichen können:Zum Beispiel:
quelle
Sie können ein Skript wie folgt schreiben:
Sie können es so etwas wie nennen
gitpull
.Wenn Sie es lieber haben möchten, machen Sie beliebige Verzeichnisse anstelle von
/X/Y
:Dann können Sie es mit
gitpull /X/Z
Zuletzt können Sie versuchen, Repositorys zu finden. Ich habe einen
~/git
Ordner, der Repositorys enthält, und Sie können diesen verwenden, um alle abzurufen.quelle
(cd /X/Y && git pull)
.Für jemanden wie mich, der dies über einen Drush-Befehl (Drupal-Shell) auf einem Remote-Server versucht hat, können Sie die Lösung nicht verwenden, für die Sie eine CD in das Arbeitsverzeichnis benötigen:
Stattdessen müssen Sie die Lösung verwenden, die den Pull in ein Fetch & Merge aufteilt:
quelle
Dies mag ein ähnliches Problem sein, aber Sie können Ihre Befehle auch einfach verketten. z.B
In einer Zeile
Oder über SSH.
quelle