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 exec
chiamata.
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 exec
chiamata.
Risposte:
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
fatal: Not a git repository (or any of the parent directories): .git
. @Patrick non ho votato giù per niente?
--work-dir
che penso)
git status
,. -C
è il modo corretto di procedere.
Usa -C
opzione ( documenti ):
git -C /home/repo log
Questo è quasi equivalente --git-dir
e --work-tree
senza aggiungere la solita .git
cartella
Modificare:
Risposta sottovalutata ... abbastanza sorprendente, poiché, a rigor di termini, questa è l'unica risposta corretta alla domanda. Le opzioni --git-dir
e --work-tree
non esistono per accedere al repository dall'esterno dell'albero di lavoro, vengono utilizzate per spostare .git
altrove 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-dir
o --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-tree
non funziona affatto con il log
sottocomando 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.
git stash
è un altro esempio di un sottocomando che fallisce se --git-dir
e --work-tree
vengono usati.
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
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
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-prefix
relativo 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
.
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