Como executo um comando Git sem estar no repositório?

131

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.

Torre
fonte
3
Você não pode simplesmente "cd / home / repo && git log" como sua chamada executiva?
Alex Howansky
Eu tenho alguns problemas estranhos com isso. Estou iniciando um novo processo, não realmente um executivo, mas não sei muito bem como eles diferem. Acho mais fácil encontrar apenas um parâmetro para especificar o diretório git.
Torre
1
Possível duplicado de git pull enquanto não estiver em um diretório git
Trevor Boyd Smith
1
git --git-dir = / home / repositório / .git log
Atiq Ur Rehman

Respostas:

102

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
max
fonte
2
Eu continuo recebendo fatal: Not a git repository (or any of the parent directories): .git. @ Patrick Eu não votei em nada?
Torre
3
@Patrick A resposta foi editada (originalmente disse que --work-direu acho)
Gareth
1
Isso não funcionou para mim, pois mostrou todos os arquivos da confirmação como excluídos. Parece que está verificando o commit, mas não o conteúdo da pasta. Consulte a resposta de @calandoa para obter um melhor desempenho.
Mxcd 5/05/19
2
Não funcionou para mim usando a última git, porém com a opção -C funcionou, exemplo: git -C /home/repo/.git log
D.Snap
1
isso realmente não funcionou como o po esperava. por que essa resposta é aceita? Isso usará o diretório atual como árvore de trabalho e usará o .git especificado para o histórico, o que está completamente errado. Se você não mostrar apenas o log, por exemplo git status,. -Cé o caminho correto a seguir.
Wang
218

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.

calandoa
fonte
Obrigado por adicionar explicações adicionais.
Erick G. Hagstrom
git stashé outro exemplo de um subcomando que falha se --git-dire --work-treeé usado.
d5ve
4
A opção -C foi adicionado na versão 1.8.5 do git, que foi lançado em 2013.
d5ve
-C funcionou melhor do que --git-dir para mim ... -C honra as definições de configuração do git para o repositório. Estou executando a versão git 1.9.5.msysgit.1
straff
@calandoa sempre precisamos especificar o local a partir da raiz, mais uma coisa, se o nome do repositório contiver várias palavras como
inserimos
17

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
alberto56
fonte
1
Isso é mais correto do que a resposta apenas com --git-dir. git-scm.com/blog/2010/04/11/environment.html
Erick G. Hagstrom
11

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

centavo chan
fonte
3

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.

Brian Vandenberg
fonte
1

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
Paula
fonte