ficando “fatal: não é um repositório git: '.'” ao usar o gancho pós-atualização para executar 'git pull' em outro repo

89

Eu sou novo no git, então peço desculpas (e por favor me corrija) se eu usar indevidamente a terminologia aqui, mas farei o meu melhor.

Estou tentando configurar um repositório git (hub) e uma cópia de trabalho do site de desenvolvimento (prime) em um servidor web. Tentei padronizá-lo após este artigo . Quero que a cópia de trabalho de desenvolvimento seja atualizada sempre que o repositório de hub for enviado. Tenho a impressão de que o gancho adequado para isso é post-update, que criei assim:

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET

Atualizar

Quando envio as alterações do meu repositório local para o hub vazio, recebo a seguinte saída do script pós-atualização:

remote: sites
remote: fatal: Not a git repository: '.'

No entanto, se eu usar o SSH no servidor como 'sites' do usuário e executar este script manualmente, ele funcionará muito bem. Alguma idéia do que pode estar errado com este gancho ou script?

Ty W
fonte

Respostas:

179

Aqui está o roteiro que funcionou. Acho que a parte que faltava originalmente que o impedia de funcionar remotamente era ounset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info
Ty W
fonte
18
Posso confirmar, desconfigurar GIT_DIRresolve o problema.
jmtd de
16
Para aqueles que desejam entender o porquê: é porque git usa a variável em GIT_DIRvez de PWD. cd-ing muda o PWDnão GIT_DIR. Deve haver um fallback no git de GIT_DIRpara PWDcaso o primeiro não esteja disponível.
zupa de
A questão é por que o git deve ver que é necessário fazer isso para o script de gancho (defina GIT_DIR para que até mesmo o script tenha 'cd' em outro lugar 'git tudo' ainda funcionará)? Eu pessoalmente optaria por que o git não faça esse tipo de mágica.
Steven Haryanto
2
A razão por trás disso é que o Git está aplicando algumas variáveis ​​de ambiente a todos os comandos principais do git.
Casey
O que acontece quando há um conflito de mesclagem depois git pull?
lolololol de
29

Em vez disso, tente:

#!/bin/sh
cd /path/to/working-copy/
env -i git pull
Geraldo Luis da Silva Ribeiro
fonte
0

Apesar de que GIT_DIR não definido simplesmente funciona.

o problema ocorre quando você define GIT_DIR incorretamente em outro lugar.

você pode simplesmente adicionar isso: GIT_DIR = .git / Vai funcionar

Zvika Naveh
fonte
0

No meu caso, eu tinha especificado uma árvore de trabalho, e isso quebra em alguns comandos, como pull(ou mais precisamente fetch).

Para remover a configuração da árvore de trabalho se ela estiver em sua configuração git, use:

git config --unset core.worktree

(Existem outras maneiras de definir uma árvore de trabalho)

Importante observar,

Não há quase nenhuma mudança neste ser seu problema, a menos que você mesmo tenha cavado esse buraco ao seu redor usando uma árvore de trabalho personalizada em primeiro lugar.

Brincadeira:

Isso implica para mim que os internos do git usam caminhos relativos à worktree + .git/em alguns casos. Na minha experiência, as árvores de trabalho não são bem suportadas, exceto pelas partes mais fundamentais do git. Eu não experimentei completamente, o Git provavelmente se comportaria se eu definir qualquer que seja a variável de configuração do diretório git corretamente, com a qual eu não brinquei.

ThorSummoner
fonte
-1

Você provavelmente tem um problema de permissão. Não tenho certeza de como você configurou seu repositório git, mas se ele estiver sendo executado sob o gitusuário, certifique-se de que o gitusuário tem permissão para executar o git pullno diretório do projeto.

Opcionalmente, tente isso para descobrir qual usuário você é quando o gancho é executado:

echo `whoami`
Ariejan
fonte
se eu ssh no servidor como o usuário git, posso usar git pull no diretório do meu projeto sem problemas. Eu acredito que é o usuário que deve ser executar o script. Posso tentar adicionar a linha whoami ao script, mas para onde vai a saída desse script quando é executado como um gancho? Talvez eu precise enviar essa saída para um arquivo de log em vez de ecoar?
Ty W
O echo `whoami`que whoamiisso não faz?
Christoffer Hammarström,
A saída para stdout de um script de gancho é visível para o remoto executando a ação. Ou, em outras palavras, se você disser 'git push', a saída de um gancho no controle remoto aparecerá em seu stdout.
ebneter
sim, percebi isso enquanto brincava com as coisas. muito conveniente :)
Ty W