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.
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.
Antworten:
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
fatal: Not a git repository (or any of the parent directories): .git. @Patrick Ich habe nichts abgelehnt?
--work-dirich denke)
git status. -Cist der richtige Weg.
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.
git stashist ein weiteres Beispiel für einen Unterbefehl, der fehlschlägt, wenn --git-dirund --work-treeverwendet werden.
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
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
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.
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