Wie führe ich einen Git-Befehl aus, ohne im Repository zu sein?

130

Gibt es eine Möglichkeit, Git-Befehle für ein Repository auszuführen, ohne sich in diesem Repository zu befinden?

Zum Beispiel so etwas : git /home/repo log?

Bitte sag mir das nicht cd. Ich mache das über einen execAnruf.

Turm
quelle
3
Können Sie nicht einfach "cd / home / repo && git log" als Ihren Exec-Aufruf?
Alex Howansky
Ich habe einige seltsame Probleme damit. Ich beginne einen neuen Prozess, nicht wirklich ein Exec, aber ich weiß nicht viel, wie sie sich unterscheiden. Ich finde es einfacher, nur einen Parameter zu finden, um das Git-Verzeichnis anzugeben.
Turm
1
Mögliches Duplikat von Git Pull, wenn es sich nicht in einem Git-Verzeichnis befindet
Trevor Boyd Smith
1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

Antworten:

101

Versuchen:

git --git-dir=/home/repo/.git log

Es ist wichtig, den Pfad bis zum .git-Verzeichnis Ihres Repositorys anzugeben. Andernfalls erhalten Sie nur eine Fehlermeldung mit folgenden Angaben:

fatal: Not a git repository
max
quelle
2
Ich bekomme immer fatal: Not a git repository (or any of the parent directories): .git. @Patrick Ich habe nichts abgelehnt?
Turm
3
@ Patrick Die Antwort wurde bearbeitet (es sagte ursprünglich, --work-dirich denke)
Gareth
1
Dies hat bei mir nicht funktioniert, da alle Dateien des Commits als gelöscht angezeigt wurden. Scheint, als würde das Commit überprüft, aber nicht der Ordnerinhalt. Weitere Informationen zur besseren Leistung finden Sie in der Antwort von @calandoa.
mxcd
2
Hat bei mir mit dem neuesten Git nicht funktioniert, aber mit der Option -C hat es funktioniert, Beispiel: Git -C /home/repo/.git log
D.Snap
1
Dies funktionierte tatsächlich nicht wie erwartet. Warum ist dies eine akzeptierte Antwort? Dadurch wird das aktuelle Verzeichnis als Arbeitsbaum verwendet und die angegebene .git-Datei für den Verlauf verwendet, was völlig falsch ist. Wenn Sie beispielsweise nicht nur das Protokoll anzeigen, z git status. -Cist der richtige Weg.
Wang
218

Verwenden Sie -COption ( docs ):

git -C /home/repo log

Dies ist fast gleichbedeutend mit --git-dirund --work-treeohne Anhängen des üblichen .gitOrdners

Bearbeiten:

Antwort abgelehnt ... ziemlich erstaunlich, da dies genau genommen die einzig richtige Antwort auf die Frage ist. Die Optionen --git-dirund --work-treesind nicht vorhanden, um von außerhalb des Arbeitsbaums auf das Repository zuzugreifen. Sie werden verwendet, um das Repository an einen .gitanderen Ort zu verschieben, und in einigen Fällen ist die Verwendung viel komplizierter.

Zum Beispiel, um nur das Protokoll von zu erhalten /home/repo/subdir:

git -C /home/repo/subdir log .

oder

git -C /home/repo log subdir

Es ist nicht möglich, log .mit --git-diroder zu verwenden --work-tree. Der Pfad muss verarbeitet werden, um den Unterpfad relativ zum oberen Rand des Arbeitsbaums zu extrahieren. Selbst in diesem Fall erkennt git ihn nicht als Pfad, wenn Sie die --Option nicht verwenden. Der einzig mögliche Weg ist also:

git --git-dir /home/repo/.git log -- subdir

Außerdem --work-treefunktioniert mit logUnterversion mit meiner Version (git 1.9.1) überhaupt nicht. Es wird einfach ignoriert:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

Ich verstehe nicht einmal, ob dies ein Fehler oder eine Funktion ist ... wie bei vielen Git-Design-Optionen üblich.

Calandoa
quelle
Vielen Dank für die zusätzliche Erklärung.
Erick G. Hagstrom
git stashist ein weiteres Beispiel für einen Unterbefehl, der fehlschlägt, wenn --git-dirund --work-treeverwendet werden.
d5ve
4
Die Option -C wurde in Version 1.8.5 von git hinzugefügt, die 2013 veröffentlicht wurde.
d5ve
-C hat bei mir besser funktioniert als --git-dir ... -C berücksichtigt die Git-Konfigurationseinstellungen für das Repo. Ich verwende Git Version 1.9.5.msysgit.1
Straff
@calandoa müssen wir immer den Ort von der Wurzel angeben, eine weitere Sache, wenn der Name des Repos mehrere Wörter enthält, wie wir in diesen Code einfügen
Kasun Siyambalapitiya
17

Tatsächlich müssen Sie --git-dir und --work-tree zusammen verwenden. Hier ist ein Beispiel:

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di
alberto56
quelle
1
Dies ist korrekter als die Antwort mit --git-dir allein. git-scm.com/blog/2010/04/11/environment.html
Erick G. Hagstrom
11

Ich habe es oft versucht! Ich habe es endlich verstanden!

git -C dir --no-pager log --format='%an' -1 filename

Denken Sie daran, bitte fügen Sie nicht .git zu Ihrem hinzu

-C dir

Penny Chan
quelle
3

Dies ähnelt der Antwort von @ max. Leider hat --git-dir nicht getan, was ich brauchte. bearbeiten Im Nachhinein schlug eine andere [vorherige] Antwort, die ich nicht gelesen hatte, die Verwendung vor --work-tree. Ich bin mir nicht sicher , ob Umgebung oder Flags besser geeignet ist , damit ich meine Antwort , falls darin jemand findet verwenden lassen würde, aber ich werde benutzen Einschalten --work-tree/ --git-dir.


Es gibt zwei Repos, eines in dem anderen, aber kein Submodul. das äußere Repo ignoriert es:

tools (outer repo)
  gcc/4.9.2 (inner repo)

Was ich wollte, war die Ausgabe git rev-parse --show-prefixrelativ zum äußeren Repo. Folgendes habe ich mir ausgedacht (Bash-Syntax; zur besseren Lesbarkeit auf mehrere Zeilen aufgeteilt):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

Bei Ausführung aus 4.9.2 wird die Zeichenfolge erzeugt gcc/4.9.2.

Brian Vandenberg
quelle
1

Für jeden Git-Befehl können Sie Folgendes tun:

git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>

Zum Beispiel, wenn Sie einen Git-Status erstellen möchten:

 git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  status

oder wenn Sie die Filiale überprüfen möchten, in der sich das Repo befindet:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
Paula
quelle