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?


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.


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!


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.