Git: puxar automaticamente do repositório?

91

Existe alguma maneira de configurar o git de forma que ele ouça atualizações de um repo remoto e faça pull sempre que algo mudar? O caso de uso é que eu quero implantar um aplicativo da web usando git (para obter o controle de versão do aplicativo implantado), mas quero colocar o repositório git "central" no Github em vez de no servidor da web (a interface do Github é tãããão legal) .

Alguém conseguiu fazer isso funcionar? Como o Heroku faz isso? Meu Google-fu não está me dando resultados relevantes.

Li Haoyi
fonte

Respostas:

49

Git possui "ganchos", ações que podem ser executadas após outras ações. O que você parece estar procurando é um "gancho pós-recebimento". No administrador do github, você pode configurar um url pós-recebimento que será acessado (com uma carga contendo dados sobre o que foi enviado) toda vez que alguém enviar um push para o seu repo.

Pelo que vale a pena, não acho que o pull automático seja uma boa ideia - e se algo de errado fosse enviado ao seu branch? Eu usaria uma ferramenta como capistrano(ou equivalente) para essas coisas.

ksol
fonte
12
Meu caso de uso planejado era ter um repositório / branch separado para o estágio de "teste e bagunça" dev, e um repositório especial "push to production" para o qual envio apenas quando tiver certeza de que tudo funciona. Basicamente, estou usando o Git para fazer o rsync, exceto que ele mantém um registro de todas as versões que são implantadas, e eu poderia facilmente reverter para uma versão anterior. A vantagem sobre algo mais hardcore como o capistrano é que eu não teria que aprender uma ferramenta totalmente nova para o que é (por enquanto) um projeto realmente pequeno.
Li Haoyi,
A autenticação de webhook adiciona complexidade e problemas de segurança extras, portanto, as soluções baseadas em pull ainda têm suas vantagens. O controle de versão de lançamento pode ser feito com tags para evitar a implantação acidental.
lz96
21

No Unix-likes você pode criar um cron job que chama "git pull" (todos os dias ou todas as semanas ou o que quer que seja) em sua máquina. No Windows, você pode usar o agendador de tarefas ou o comando "AT" para fazer a mesma coisa.

SigTerm
fonte
3
Não é uma maneira adequada de usar o Git.
deepdive
27
@deepdive Por que não? Imagine que você tem um pequeno Rasperry Pi em sua casa e nenhum IP estático disponível. Que outra opção você tem então executando um cron ou runwhen job?
kaiser
2
Não é uma boa ideia. Ele deseja que as alterações sejam aplicadas imediatamente após o envio.
boi_echos
11
O OP está solicitando especificamente um método que escute atualizações de um repo remoto e fará pull sempre que algo mudar . Esta solução seria apenas extrair do repositório de vez em quando, portanto, para que fosse eficaz, o intervalo teria que ser muito curto, levando a um grande número de solicitações de pull redundantes.
Boaz
3
Uma maneira rápida de fazer isso sem alterar guia cron: while true; do git pull; sleep 10; done. Isso acontecerá a git pullcada 10 segundos ...
JakeD
3

Existem programas de integração contínua, como Jenkins ou Bamboo, que podem detectar commits e disparar operações como build, teste, pacote e implantação. Eles fazem o que você quer, mas são pesados ​​com dependências, difíceis de configurar e no final eles podem usar checagem periódica no repositório git, o que teria o mesmo efeito de chamar git pull por cron a cada minuto.

Pavel Niedoba
fonte
0

Eu sei que esta questão é um pouco antiga, mas você pode usar o log do Windows e git para autopull seu projeto usando um webhook e php (assumindo que seu projeto envolve um servidor da web. Veja minha essência aqui: https://gist.github.com/ upggr / a6d92e2808e9628ebe0d01fd93569f4a

Ioannis Kokkinis
fonte