Existe uma maneira de executar comandos Git em um repositório sem estar nesse repositório?
Por exemplo, algo como isto git /home/repo log:?
Por favor, não me diga cdpara fazê-lo. Estou fazendo isso por meio de uma execligação.
Existe uma maneira de executar comandos Git em um repositório sem estar nesse repositório?
Por exemplo, algo como isto git /home/repo log:?
Por favor, não me diga cdpara fazê-lo. Estou fazendo isso por meio de uma execligação.
Respostas:
Experimentar:
git --git-dir=/home/repo/.git log
É importante fornecer o caminho até o diretório .git do seu repositório. Caso contrário, você receberá apenas uma mensagem de erro que diz algo como:
fatal: Not a git repository
fatal: Not a git repository (or any of the parent directories): .git. @ Patrick Eu não votei em nada?
--work-direu acho)
git status,. -Cé o caminho correto a seguir.
Use a -Copção ( documentos ):
git -C /home/repo log
Isso é quase equivalente --git-dire --work-treesem anexar a .gitpasta usual
Editar:
Resposta com voto negativo ... bastante surpreendente, pois, estritamente falando, esta é a única resposta correta para a pergunta. As opções --git-dire --work-treenão existem para acessar o repositório de fora da árvore de trabalho, são usadas para mover o.git outro lugar e são muito mais complicadas de usar em alguns casos.
Por exemplo, para obter apenas o log /home/repo/subdir:
git -C /home/repo/subdir log .
ou
git -C /home/repo log subdir
Não é possível usar log .com --git-dirou --work-tree. O caminho deve ser processado para extrair o subcaminho em relação à parte superior da árvore de trabalho e, mesmo nesse caso, o git não o reconhecerá como um caminho se você não usar a --opção, portanto, a única maneira possível é:
git --git-dir /home/repo/.git log -- subdir
Além disso, --work-treenão está funcionando com o logsubcomando com a minha versão (git 1.9.1). É apenas ignorado:
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
Eu nem entendo se isso é um bug ou um recurso ... como sempre, com muitas opções de design do git.
git stashé outro exemplo de um subcomando que falha se --git-dire --work-treeé usado.
De fato, você precisa usar --git-dir e --work-tree juntos. Aqui está um exemplo:
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
Eu tentei muitas vezes! Eu finalmente entendi!
git -C dir --no-pager log --format='%an' -1 filename
lembre-se, por favor, não adicione .git ao seu
-C dir
Isso é semelhante à resposta do @ max. Infelizmente, --git-dir não fez o que eu precisava. editar Em retrospecto, outra resposta [anterior] que eu não tinha lido sugeriu o uso --work-tree. Não tenho certeza se o uso de ambiente ou sinalizadores é mais apropriado, portanto deixarei minha resposta caso alguém encontre uso nele, mas mudarei para usar --work-tree/ --git-dir.
Há dois repositórios, um dentro do outro, mas não um submódulo; o repositório externo o ignora:
tools (outer repo)
gcc/4.9.2 (inner repo)
O que eu queria era a saída de em git rev-parse --show-prefixrelação ao repositório externo. Aqui está o que eu criei (sintaxe do bash; dividida em linhas para facilitar a leitura):
prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)
Quando executado a partir do 4.9.2, produz a string gcc/4.9.2.
Para qualquer comando git, você pode:
git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>
Por exemplo, se você deseja fazer um status git:
git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/ status
ou se você deseja verificar a filial em que o repo está:
git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/ rev-parse --abbrev-ref HEAD