Mantendo repositórios git em diferentes hosts em sincronia

34

Estou pensando em iniciar um projeto pequeno e quero fazer sua versão com o git.

Bitbucket parece uma boa opção para mim com seu plano gratuito. Eu quero usá-lo como a principal ferramenta para trabalhar com o git, pois eles têm boas ferramentas como interface da web, cliente do Mac OS e assim por diante. Mas, para ter uma proteção mais alta contra danos acidentais que podem ser causados ​​pelo uso de um serviço de terceiros, também quero instalar o git no meu NAS como uma segunda cópia de backup do repositório.

Agora, minha pergunta é: é possível criar um repositório em dois hosts diferentes e depois mantê-los sincronizados? Por exemplo, suponha que uma vez por semana eu atualize o repositório no meu NAS para corresponder ao do Bitbucket. Então, caso algo aconteça com o Bitbucket, ainda terei o repositório completo com histórico completo de desenvolvimento no meu armazenamento NAS local.

E existe uma maneira de importar um repositório existente com histórico completo para outro serviço git?


Eu acho que espelhar é o que eu preciso. Este artigo parece descrever exatamente o que eu preciso. E este um bem.

Eu acredito que ele fará uma cópia completa com histórico completo e até mesmo comprometerá automaticamente novas versões para os repositórios nos dois hosts automaticamente.

Estou certo?

BartoNaz
fonte
Eu estou usando o xpdev Gostaria de saber em sua situação de 2 sistemas qual seria o benefício de usar o git no seu caso. só para ter certeza de cada compilação final eu faço um backup usb. Mas, basicamente, o controle de versão é tratado no xpdev, portanto, não é um requisito real. BTW, se você possui um tolo prova NASS RAID1, ou então você pode considerar executar seus próprios sistemas de controle de versão, existem algumas freeones também
user613326
Mas eu quero ter o versionamento completo disponível em 2 lugares. Se a hospedagem dies, ou a empresa, terceiro executá-lo, simplesmente desaparece, eu quero ter exatamente a mesma experiência ainda com toda a história de versão ...
BartoNaz
Isso significa que terei o Bitbucket para conforto e git no NAS para 99,9% de segurança.
BartoNaz #
Quanto ao xp-dev, sua improvável empresa morre, eles podem alterar os planos de hospedagem de códigos, preços etc. ou se fundir com outra empresa. Mas é uma vaca leiteira para eles. E eles também farão backup dos dados valiosos. É o negócio deles permanecer no lugar. Eu o uso com 3 desenvolvedores e nosso código existe em 5 máquinas diferentes, onde sempre há uma cópia de origem local que é sincronizada no xp dev. O XP dev é gratuito se você tiver apenas alguns projetos.
user613326
1
Claro, é improvável. Mas ainda assim, você nunca pode ter 100% de certeza ...
BartoNaz

Respostas:

19

Sim, essa é exatamente a beleza do DVCS, como o git. Você pode usar qualquer número de repositórios diferentes com o mesmo estado que aquele no bitbucket ou no github.

Até a sua cópia local (o repositório no seu computador) geralmente é um clone completo do repositório remoto.

A única coisa que você precisa fazer para manter vários repositórios em sincronia é buscar um (normalmente chamado origem ou upstream) e enviar para as cópias de backup.

Wilbert
fonte
11
Infelizmente, nem tudo é tão brilhante. Veja a versão preventiva do KDE quase desastre . Ou seja, verifique se o backup não exclui itens (ramificações, repositórios etc.) que foram excluídos no servidor de backup.
Jan Hudec
Ainda não tenho certeza se entendi corretamente. Tanto quanto eu entendo, empurrar e puxar funciona com uma determinada versão. Mas digamos que eu tenha uma versão recente do código na minha máquina de trabalho. Eu tenho o repositório git no host remoto (Bitbucket, Github ou qualquer outra coisa), com histórico completo do desenvolvimento do código até a versão mais recente que tenho na máquina em funcionamento (se foi confirmada). E eu tenho um repositório no NAS que está vazio. Posso importar o histórico completo do código do host remoto para o meu NAS para que eu tenha dois repositórios idênticos em dois locais e como?
BartoNaz #
2
Clone o repositório remoto e puxe todas as atualizações (todas as ramificações) para ele em intervalos regulares. Um clone git contém o histórico, não é como um svn checkout que possui apenas a versão mais recente.
Wilbert:
11

Aqui está uma solução testada para o problema: Repositórios Git remotos de sincronização automática 2

Um script simples para sincronizar 2 repositórios Git remotos

Eu pesquisei na web por um script simples que será sincronizado. 2 repositórios remotos, mas não consegui encontrar esse script, mesmo que muitos pareçam procurá-lo! Então, eu criei 2 repositórios de teste simples e comecei a testar e criar esse script.

O que esse script deve fazer?

Bem, em geral, as etapas para isso são simples: 1. Clone o primeiro repositório 1. Adicione o segundo como um repositório remoto adicional 1. busque tudo o que há no segundo repositório 1. envie o repositório local atualizado para o 2 repositórios remotos.

O problema restante é: quais são as opções corretas para todos os comandos git acima?

Então aqui está...

Script 2repos-sync.sh gisp

# Clear the folder first - please use this carefully
rm -rf $REPO_NAME  
# clone the reposotory
git clone --bare $ORIGIN_URL

# add a remote repository
cd $REPO_NAME
git remote add --mirror=fetch repo1 $REPO1_URL

# update the local copy from the first repository
git fetch origin --tags

# update the local copy with the second repository
git fetch repo1 --tags

# sync back the 2 repositories
git push origin --all
git push origin --tags
git push repo1 --all
git push repo1 --tags

NOTA - este script não está resolvendo casos de conflitos entre o conteúdo do repositório!

yorammi
fonte
Você pode mencionar na sua resposta que a primeira coisa a fazer é excluir um diretório local existente com $ REPO_NAME. Isso parece importante e pode impedir a perda de dados para pessoas que simplesmente copiam sua solução.
Wilbert
Para acompanhar isso, o LibGit2 é útil para esse tipo de coisa.
RubberDuck
0

Eu uso um GitLab privado para armazenar todos os meus repositórios, portanto, tenho apenas uma origem de onde empurro e puxo enquanto faço o desenvolvimento do dia a dia.

Mas, para projetos de código aberto, o GitHub é uma comunidade muito mais vibrante; portanto, se eu quiser aceitar contribuições da comunidade para meus projetos, uso o sistema de gancho da web do GitLab da web para executar ping em um servidor executado, que atualiza meus repositórios públicos no GitHub.

Isso permite que eu trate o GitHub como outro controle remoto que eu possa usar quando alguém contribuir - depois mesclar - no-ff localmente, e haverá um fluxo de como todos os meus repositórios primário e público distribuem as alterações.

diffalot
fonte