354 Stimmen

git pull, während man sich nicht in einem git-Verzeichnis befindet

Nehmen wir an, ich habe ein Verzeichnis, /X/Y das ein Git-Repository ist. Ist es möglich, irgendwie einen Befehl aufzurufen wie git pull von innen /X sondern auf die Zielgruppe der /X/Y Verzeichnis?

EDITAR: Ich schätze, ich fragte mich speziell: ist es möglich, dies mit dem Befehl git zu tun, aber ohne Verzeichnisse zu ändern?

HINWEIS: Ich habe akzeptiert VonCs Antwort weil es viel eleganter ist als die bisherigen Optionen. Für Leute, die Git älter als 1.8.5 benutzen, lesen Sie bitte Antwort von bstpierre unten .

518voto

VonC Punkte 1117238

Start: git 1.8.5 (Q4 2013) können Sie "einen Git-Befehl verwenden, ohne Verzeichnisse wechseln zu müssen".

Genau wie " make -C <directory> ", " git -C <directory> ... " sagt Git, dass sie dorthin gehen soll, bevor sie etwas anderes tut .

Véase 44e1e4 festlegen por Nazri Ramliy :

Es sind mehr Tastendrücke erforderlich, um den Git-Befehl in einem anderen Verzeichnis aufzurufen, ohne das aktuelle Verzeichnis zu verlassen:

  1. (cd ~/foo && git status) git --git-dir=~/foo/.git --work-tree=~/foo status GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

Die oben gezeigten Methoden sind für die Skripterstellung akzeptabel, aber zu umständlich für schnelle Befehlszeilenaufrufe.

Mit dieser neuen Option können die oben genannten Aufgaben mit weniger Tastenanschlägen erledigt werden:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

Seit Git 2.3.4 (März 2015), und Übergabe 6a536e2 por Karthik Nayak ( KarthikNayak ) , git behandelt " git -C '<path>' " als eine kein Problem, wenn <path> leer ist.

' git -C "" ' stirbt hilfslos mit dem Fehler " Cannot change to '' ", während die Shell cd ""' als No-op behandelt.
Das Verhalten der Muschel als Präzedenzfall nehmen und unterrichten git -C ""' ebenfalls als No-op zu behandeln.


4 Jahre später, Git 2.23 (Q3 2019) dokumentiert, dass git -C "" ' funktioniert und wechselt das Verzeichnis nicht

Es verhält sich so seit 6a536e2 ( git : behandeln " git -C '<path>' " als ein No-op, wenn <path> ist leer, 2015-03-06, Git v2.3.4).

Das bedeutet die Dokumentation umfasst nun (endlich):

Wenn ' <path> ' vorhanden, aber leer ist, z. B. -C "" wird das aktuelle Arbeitsverzeichnis unverändert beibehalten.


Sie können sehen git -C verwendet mit Git 2.26 (Q1 2020), als Beispiel.

Véase Übergabe b441717 , Commit 9291e63 , Commit 5236fce , Übergabe 10812c2 , 62d58cd festlegen , Übergabe b87b02c , Commit 9b92070 , 3595d10 festlegen , Übergabe f511bc0 , f6041ab übertragen , Übergabe f46c243 , 99c049b festlegen , Commit 3738439 , 7717242 übertragen , Übergabe b8afb90 (20. Dezember 2019) von Denton Liu ( Denton-L ) .
(Zusammengefasst von Junio C. Hamano -- gitster -- en 381e8e9 übertragen , 05. Februar 2020)

t1507 : inline full_name()

Abgezeichnet von: Denton Liu

Vorher liefen wir test_must_fail full_name . Allerdings, test_must_fail sollte nur für Git-Befehle verwendet werden.
Inline full_name() so dass wir test_must_fail über die git Befehl direkt.

Wenn full_name() wurde eingeführt in 28fb84382b ("Vorstellen <branch>@{upstream} notation", 2009-09-10, Git v1.7.0-rc0 -- zusammenführen ), die git -C noch nicht verfügbar war (da sie erst in 44e1e4d67d (" git : run in a directory given with -C option", 2013-09-09, Git v1.8.5-rc0 -- zusammenführen aufgeführt in Los Nr. 5 )).
Mit der Hilfsfunktion entfällt die Notwendigkeit, manuell cd jedes Mal. Da jedoch git -C jetzt verfügbar ist, können wir das stattdessen verwenden und inline full_name() .

59voto

bstpierre Punkte 28260

bearbeiten :

Entweder gibt es einen Fehler bei git pull oder Sie können nicht das tun, was Sie mit diesem Befehl tun wollen. Sie peut jedoch mit "fetch and merge" arbeiten:

cd /X
git --git-dir=/X/Y/.git fetch
git --git-dir=/X/Y/.git --work-tree=/X/Y merge origin/master

Ursprüngliche Antwort :

Unter der Annahme, dass Sie die Bash oder ein ähnliches Programm verwenden, können Sie Folgendes tun (cd /X/Y; git pull) .

En Git-Manpage gibt einige Variablen an (siehe "Das git-Repository"), die anscheinend helfen sollten, aber ich kann sie nicht richtig zum Laufen bringen (mit meinem Repository in /tmp/ggg2):

GIT_WORK_TREE=/tmp/ggg2 GIT_DIR=/tmp/ggg2/.git git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.

Wenn ich den folgenden Befehl ausführe, während mein cwd auf /tmp steht, wird das Projektarchiv aktualisiert, aber die aktualisierte Datei erscheint in /tmp statt im Arbeitsbaum /tmp/ggg2:

GIT_DIR=/tmp/ggg2/.git git pull

Siehe auch diese Antwort auf eine ähnliche Frage die die --git-dir y --work-tree Flaggen.

34voto

takeshin Punkte 46602

Sie können es in ein Bash-Skript oder einen Git-Alias verpacken:

cd /X/Y && git pull && cd -

32voto

samtresler Punkte 643

Dieser Beitrag ist ein bisschen alt, also könnte es sein, dass es einen Fehler gab und er behoben wurde, aber ich habe das gerade gemacht:

git --work-tree=/X/Y --git-dir=/X/Y/.git pull origin branch

Und es hat funktioniert. Ich brauchte eine Minute, um herauszufinden, dass es die Punktdatei und das übergeordnete Verzeichnis haben wollte (in einem Standard-Setup sind diese immer übergeordnet/untergeordnet, aber nicht in ALLEN Setups, also müssen sie explizit angegeben werden.

7voto

IvanD Punkte 7228

Da einige meiner Server auf einer alten Ubuntu LTS-Version laufen, kann ich git nicht einfach auf die neueste Version aktualisieren (die die Option -C unterstützt, wie in einigen Antworten beschrieben).

Dieser Trick funktioniert bei mir gut, vor allem, weil er nicht den Nebeneffekt einiger anderer Antworten hat, die Sie in einem anderen Verzeichnis zurücklassen, als Sie begonnen haben.

pushd /X/Y
git pull
popd

Oder es als Einzeiler zu tun:

pushd /X/Y; git pull; popd

Sowohl Linux als auch Windows haben die Befehle pushd und popd.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X