Espelhamento de repository do Gitlab

É possível ter a configuração do gitlab para sincronizar automaticamente (espelhar) um repository hospedado em outro local?

No momento, a maneira mais fácil de fazer isso envolve enviar manualmente para os dois (gitlab e o outro) repository, mas isso é demorado e propenso a erros.

O maior problema é que um espelho pode ressincronizar se dois usuários enviam simultaneamente alterações para os dois repositorys diferentes. O melhor método que posso usar para evitar esse problema é garantir que os usuários só possam enviar um dos repositorys.

Atualização de dezembro de 2016: o espelhamento é suportado com o GitLAb EE 8.2+: consulte ” Espelhamento de repository “.

Como comentado por Xiaodong Qi :

Essa resposta pode ser simplificada sem usar nenhuma linha de comando (basta configurá-la na interface de gerenciamento do repository do Gitlab)


Resposta original (janeiro de 2013)

Se o seu repository espelhado remoto é um repository vazio, você pode adicionar um gancho de pós-recebimento ao seu repository gerenciado pelo gitlab e enviá-lo ao seu repository remoto.

#!/bin/bash git push --mirror slave_user@mirror.host:/path/to/repo.git 

Como Gitolite (usado pelo Gitlab) menciona :

Se você quiser instalar um gancho em apenas alguns repositorys específicos, faça-o diretamente no servidor.

que estaria em:

 ~git/repositories/yourRepo.git/hook/post-receive 

Advertência (atualização de outubro de 2014)

Ciro Santilli aponta nos comentários :

Hoje (quarto trimestre de 2014), isso falhará porque o GitLab vincula automaticamente github.com/gitlabhq/gitlab-shell/tree/… a todos os repositorys que ele gerencia.
Então, se você fizer essa alteração, todos os repositorys que você modificar tentarão empurrar.
Sem mencionar possíveis conflitos ao atualizar o gitlab-shell , e que o script atual é um script ruby, não bash (e você não deve removê-lo!).

Você poderia corrigir isso lendo o nome do diretório atual e garantindo a bijeção entre ele e o controle remoto, mas eu recomendo que as pessoas fiquem muito longe dessas coisas.

Veja (e vote) feeadback “Envio automático para repo espelho remoto após push para o GitLab Repo ” .


Update July 2016: Eu vejo esse tipo de recurso adicionado para o GitLab EE (Enterprise Edition): MR 249

  • Adicionar capacidade para inserir o URL de envio remoto nas configurações do Repositório de Espelhamento
  • Adicione o código de implementação para enviar para o repository remoto
  • Adicionar novo trabalhador em segundo plano
  • Mostrar data de atualização mais recente e erros de synchronization, se existirem.
  • Sincronize o espelho remoto a cada hora.

Observe que o recente Remote Mirror Repository ( problemas 17940 ) pode ser complicado:

Atualmente estou tentando mudar o desenvolvimento principal dos módulos open source npm da minha empresa Lossless GmbH ( https://www.npmjs.com/~lossless ) de GitHub.com para GitLab.com

Estou importando todos os Mirror Repository do GitHub, no entanto, quando tento desativar o Mirror Repository e ativar o Remote Mirror Repository com a URL original do GitHub, recebo um erro dizendo:

 Remote mirrors url is already in use 

Aqui está um dos repositorys que falharam com: https://gitlab.com/pushrocks/npmts Editado há 2 meses

Acontece que requer apenas várias etapas:

  • desativar o repository de espelhamento
  • pressione salvar
  • remova o URl
  • pressione salvar
  • em seguida, adicione o Espelho Remoto

Se não estiver hospedando seu próprio GitLab, vale a pena saber que o GitLab.com introduziu esse recurso diretamente, sem quaisquer soluções alternativas.

  1. De dentro de um projeto, use o ícone de roda dentada para selecionar Repositório de Espelhamento
  2. Role para baixo até Empurrar para um repository remoto
  3. Checkmark Repositório de espelho remoto : atualiza automaticamente as ramificações, tags e confirmações do espelho remoto deste repository a cada hora.
  4. Digite o repository que você deseja atualizar; para o GitHub, pelo menos, você pode include seu nome de usuário e senha no URL, assim: https://yourgithubusername:yourgithubpassword@github.com/agaric/guts_discuss_resource.git

Observe que, se você estiver obtendo de um repository remoto, ele continuará enviando para o repository remoto definido aqui. Eu não tentei, mas você deve ser capaz de empurrar e puxar do mesmo repository.

Eu também criei um projeto para espelhar repositorys no GitLab 6 através da API (API usada principalmente na criação de projetos somente).

https://github.com/sag47/gitlab-mirrors

A melhor opção hoje é usar o GitLab CI. É essencialmente um servidor já implementado para os webhooks, que automaticamente clona para você e permite que você execute comandos shell arbitrários: tudo que você precisa fazer é empurrar.

os serviços são a melhor opção se alguém os implementar: eles moram na tree de origem, fazem um único push e não exigem sobrecarga extra de implantação.

A principal dificuldade de implementação agora é como armazenar as credenciais de push com segurança: provavelmente a melhor opção para o GitHub é obter uma chave de alguma forma (o Oauth na interface do usuário através do serviço seria perfeito) e armazenar esse texto simples.

Outra opção que acaba de ser adicionada são ganchos personalizados .

Você pode usar ganchos para personalizar um script que é executado após algum commit. Com isso, você pode enviar as novas alterações para outro repository. Procure mais informações sobre o gancho na seguinte página: http://git-scm.com/book/en/Customizing-Git-Git-Hooks

A melhor opção é não usar ganchos pós-recebimento, mas sim comandos de implantação que realizam synchronization via rsync, usando o Capistrano se você gosta de Ruby, usando o Shipit se você preferir Javascript (Grunt).

O GitLab Enterprise Edition agora suporta espelhamento de repository a partir da versão 8.2. As informações sobre como configurar isso estão no tópico de ajuda do Espelhamento de Repositório .