Aplicando um gancho pós-confirmação git a todos os repositórios atuais e futuros

275

Eu escrevi um gancho pós-confirmação do Git e funciona corretamente. No entanto, quero adicionar esse gancho para aplicar a todos os repositórios git atuais (e futuros) nos quais estou trabalhando. Tentei adicionar o gancho ao meu em ~/.git/hooks/vez de no diretório hooks no diretório do projeto, no entanto, isso não pareceu funcionar.

Existe alguma maneira de criar ganchos Git globais que serão aplicados a todos os repositórios no meu sistema (sem precisar copiá-los em cada diretório do projeto)? Caso contrário, qual seria a melhor solução daqui para frente - talvez um modelo git-init?

Swanson
fonte
3
A partir do Git 2.9, a melhor abordagem para isso mudou: a resposta do VonC é uma aposta melhor. stackoverflow.com/a/37293198/2741954
Simon Brahan
Isso responde sua pergunta? alterar os ganchos padrão do git
Oliver Sieweke 29/02

Respostas:

192

Desejo adicionar esse gancho para aplicar a todos os repositórios git atuais (e futuros) nos quais estou trabalhando

Com o git 2.9+ (junho de 2016), tudo o que você faria é:

git config --global core.hooksPath /path/to/my/centralized/hooks

Consulte " alterar ganchos padrão do git ": isso foi feito para gerenciar ganchos centralizados.

VonC
fonte
se eu tiver um repo existente e desejar que todos os outros desenvolvedores que recebem alterações tenham um gancho de pré-confirmação atualizado, por exemplo, como eu faria isso? obrigado
Richlewis
@Richlewis você quer dizer stackoverflow.com/a/40550555/6309 não estava completamente claro?
VonC 11/11/16
@ Richlewis Você precisaria configurar uma pasta compartilhada acessível por todos os desenvolvedores, para que eles fizessem referência em sua própria configuração local.
VonC 11/11/16
infelizmente ainda não entendi direito. dentro do repo, /.git/hooks/pre_commitposso apontar para isso?
Richlewis
@Richlewis, respondi à sua pergunta original.
VonC 11/11/16
290

A partir do git 1.7.1, você pode configurar o init.templatedir no seu gitconfig para informar ao git onde procurar por modelos.

Defina assim:

git config --global init.templatedir '~/.git_template'

Posteriormente, novos repositórios que você criar ou clonar usarão esse diretório para modelos. Coloque os ganchos em que deseja ~/.git_template/hooks. Os repositórios existentes podem ser reinicializados com os modelos adequados, executando git inito mesmo diretório .gitem que está.

Para versões git anteriores à 1.7.1, a execução git init --template ~/.git_templatefuncionará se você for como eu e ainda quiser gerenciar seu .git_templatedir junto com o restante dos seus arquivos de ponto. Você também pode usar o $GIT_TEMPLATE_DIRambiente para dizer git initonde está o diretório de modelos.

sklnd
fonte
51
Ótima resposta. Se qualquer outra pessoa se pergunta se re-correr git initem um repo existente enxuga-lo - ele não , veja: stackoverflow.com/questions/5149694/...
kontur
Para mim, não funcionou com o caminho relativo para a pasta do modelo git para copiar arquivos usando o git init em repositórios existentes. Eu tinha usado o caminho completo em seu lugar.
user847988
1
No windows sem citação: `git config --global init.templatedir d: \ git \ .git_template \`
Vladimir Vukanac 2/15/15
1
Dica: Os ganchos do modelo são copiados. Se você deseja atualizar os ganchos globais juntos, coloque o gancho em outro lugar e adicione um link simbólico no diretório de modelos (no Linux). Verifique se o caminho do link é absoluto.
Tim Allclair
1
Correr git initnão atualizou os ganchos para mim. Parece que não substituirá arquivos que já estão lá. stackoverflow.com/questions/10791486/ . Em vez disso, você precisa remover os arquivos antigos do gancho primeiro.
Phil R
69

Se você deseja que eles estejam em qualquer lugar do sistema (incluindo usuários além de você), poderá modificar o conteúdo do diretório de modelos instalado - esses estão $PREFIX/share/git-core/templates/hooks, onde $PREFIXprovavelmente está /usr/localou /usr.

Se você quer que isso seja apenas para você, sim, a coisa mais simples seria a --templateopção do git-init. Você pode facilmente manter um diretório de modelo pessoal que possui links simbólicos para a versão instalada dos padrões que deseja manter (ganchos individuais, o diretório de informações ...) e, em seguida, seu próprio conteúdo hooks/post-commite qualquer outra coisa que você queira personalizar.

Cascabel
fonte
11
Obrigado, isso funcionou bem. E para aplicá-lo retroativamente aos meus projetos existentes, eu apenas corri git initnovamente e ele adicionou meu novo gancho.
19410 swanson
Esta é uma solução elegante, mas exigiria que você alterasse todos os seus compromissos de recompra. Isso é viável, mas não há alguma possibilidade com um plug-in ou algo assim (é assim que é feito no Bazaar)?
Martin Ueding
2
Para git incorporado de SourceTree no OS X, eles estão em/Applications/SourceTree.app/Contents/Resources/git_local/share/git-core/templates/hooks
CupawnTae
1
Para o Windows este é encontrado no git diretório de instalação sob mingw64\share\templates\hooks(ou mingw32 para 32-bit)
nerdherd
1
@nerdherd agora está em mingw64\share\git-core\templates\hooks(gfw 2.25)
RJFalconer 27/02
7

Uma abordagem minimalista é criar um git_hooks/diretório em seu repositório para rastrear os ganchos que você escreve para esse projeto, chamar a atenção de usuários futuros, mencionando-o em a README, e confiar neles para fazer a coisa certa após a clonagem. Eu cogitei sobre isso por um tempo e escolhi uma abordagem incremental. No caminho, posso considerar o uso de uma ferramenta como ganchos .

Neil Best
fonte
1
Isso é tão, tão longe de ser uma solução real que eu tive que reduzir o voto, desculpe.
Victor Schröder