Come posso eseguire un comando Git senza essere nel repository?


131

C'è un modo per eseguire i comandi Git su un repository senza essere in quel repository?

Ad esempio qualcosa del genere git /home/repo log:?

Per favore, non dirmelo cd. Lo sto facendo tramite una execchiamata.


3
Non puoi semplicemente "cd / home / repo && git log" come la tua chiamata esecutiva?
Alex Howansky

Ho alcuni strani problemi con esso. Sto iniziando un nuovo processo, non un vero dirigente, ma non so molto come differiscano. Trovo più semplice trovare un parametro per specificare la directory git.
Torre



1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

Risposte:


102

Provare:

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

È importante fornire il percorso fino alla directory .git del tuo repository. Altrimenti riceverai solo un messaggio di errore che dice qualcosa come:

fatal: Not a git repository

2
Continuo a ricevere fatal: Not a git repository (or any of the parent directories): .git. @Patrick non ho votato giù per niente?
Torre

3
@Patrick La risposta è stata modificata (originariamente diceva --work-dirche penso)
Gareth

1
Questo non ha funzionato per me, poiché mostrava tutti i file del commit come cancellati. Sembra che stia controllando il commit ma non il contenuto della cartella. Fare riferimento alla risposta di @calandoa per prestazioni migliori.
mxcd

2
Non ha funzionato per me utilizzando l'ultimo git, tuttavia utilizzando l'opzione -C ha funzionato, ad esempio: git -C /home/repo/.git log
D.Snap

1
questo in realtà non ha funzionato come previsto dal po. perché questa è una risposta accettata? Questo userà la directory corrente come albero di lavoro e userà il .git specificato per la cronologia, il che è completamente sbagliato. Se non mostri solo log, ad esempio git status,. -Cè il modo corretto di procedere.
Wang

218

Usa -Copzione ( documenti ):

git -C /home/repo log

Questo è quasi equivalente --git-dire --work-treesenza aggiungere la solita .gitcartella

Modificare:

Risposta sottovalutata ... abbastanza sorprendente, poiché, a rigor di termini, questa è l'unica risposta corretta alla domanda. Le opzioni --git-dire --work-treenon esistono per accedere al repository dall'esterno dell'albero di lavoro, vengono utilizzate per spostare .gitaltrove e in alcuni casi sono molto più complicate da usare.

Ad esempio, per ottenere solo il registro di /home/repo/subdir:

git -C /home/repo/subdir log .

o

git -C /home/repo log subdir

Non è possibile utilizzare log .con --git-diro --work-tree. Il percorso deve essere elaborato per estrarre il sottopercorso relativo alla parte superiore dell'albero di lavoro, e anche in quel caso, git non lo riconoscerà come percorso se non si utilizza l' --opzione, quindi l'unico modo possibile è:

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

Inoltre, --work-treenon funziona affatto con il logsottocomando con la mia versione (git 1.9.1). È semplicemente ignorato:

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

Non capisco nemmeno se si tratta di un bug o di una funzionalità ... come al solito con molte scelte di git design.


Grazie per l'aggiunta di ulteriori spiegazioni.
Erick G. Hagstrom

git stashè un altro esempio di un sottocomando che fallisce se --git-dire --work-treevengono usati.
d5ve

4
L'opzione -C è stata aggiunta nella versione 1.8.5 di git, rilasciata nel 2013.
d5ve

-C ha funzionato meglio di --git-dir per me ... -C onora le impostazioni di git config per il repository. Sto eseguendo git versione 1.9.5.msysgit.1
Straff

@calandoa dobbiamo sempre specificare la posizione dalla radice, ancora una cosa se il nome del repo contiene più parole come inseriamo questo codice
Kasun Siyambalapitiya

17

In effetti è necessario utilizzare insieme --git-dir e --work-tree. Ecco un esempio:

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

1
Questo è più corretto della risposta con --git-dir da solo. git-scm.com/blog/2010/04/11/environment.html
Erick G. Hagstrom

11

Ho provato molte volte! Finalmente ho capito!

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

ricorda, per favore non aggiungere .git al tuo

-C dir


3

Questo è simile alla risposta di @ max. Sfortunatamente, --git-dir non ha fatto ciò di cui avevo bisogno. modifica In retrospettiva, un'altra risposta [precedente] che non avevo letto suggerì di usare --work-tree. Non sono sicuro che l'utilizzo di ambiente o flag sia più appropriato, quindi lascerò la mia risposta nel caso qualcuno lo trovi utile, ma passerò a utilizzare --work-tree/ --git-dir.


Ci sono due repo, uno dentro l'altro ma non un sottomodulo; il repository esterno lo ignora:

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

Quello che volevo era l'output di git rev-parse --show-prefixrelativo al repository esterno. Ecco cosa mi è venuto in mente (sintassi bash; diviso su righe per leggibilità):

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

Quando viene eseguito dall'interno di 4.9.2, produce la stringa gcc/4.9.2.


1

Per qualsiasi comando git, puoi fare:

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

Ad esempio, se vuoi fare uno stato git:

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

o se vuoi controllare il ramo in cui si trova il repo:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.