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.
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.
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-dirche penso)
git status,. -Cè il modo corretto di procedere.
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.
git stashè un altro esempio di un sottocomando che fallisce se --git-dire --work-treevengono 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-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.
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