Mantenere sincronizzati i repository git su host diversi


34

Sto pensando di iniziare un piccolo progetto e voglio fare il suo versioning con git.

Bitbucket sembra una buona opzione per me con il loro piano gratuito. Voglio usarlo come strumento principale per lavorare con git poiché hanno strumenti piacevoli come un'interfaccia web, un client Mac OS e così via. Ma, al fine di avere una maggiore protezione da eventuali danni accidentali che possono essere causati dall'utilizzo di un servizio di terze parti, voglio anche installare git sul mio NAS come seconda copia di backup del repository.

Ora la mia domanda è: se è possibile creare un repository su due host diversi e mantenerli sincronizzati? Ad esempio, supponiamo che una volta alla settimana aggiorni il repository sul mio NAS in modo che corrisponda a quello su Bitbucket. Quindi, nel caso in cui succeda qualcosa con Bitbucket, avrò comunque il repository completo con la cronologia completa dello sviluppo sul mio storage NAS locale.

E c'è un modo per importare un repository esistente con cronologia completa in un altro git-service?


Penso che il mirroring sia ciò di cui ho bisogno. Questo articolo sembra descrivere esattamente ciò di cui ho bisogno. E questo uno pure.

Credo che farà una copia completa con la cronologia completa e persino commetterà automaticamente nuove versioni ai repository su entrambi gli host automaticamente.

Ho ragione?


sto usando xpdev mi chiedo nella tua situazione di sistema 2 quale sarebbe il vantaggio di rompere git nel tuo caso. solo per essere sicuro da ogni build finale faccio un backup USB. Ma il controllo delle versioni di base è gestito da xpdev, quindi non è un vero requisito. A proposito, se possiedi un NASS Raid1 infallibile o giù di lì potresti considerare di eseguire i tuoi sistemi di versioning ci sono anche alcuni
freeone

Ma voglio avere il versioning completo disponibile in 2 posti. Se l'hosting di terze parti muore, o la società che lo esegue, scompare, voglio avere esattamente la stessa esperienza ancora con tutta la cronologia delle versioni ...
BartoNaz

Significa che avrò Bitbucket per comodità e git su NAS per una sicurezza del 99,9%.
BartoNaz,

Per quanto riguarda xp-dev è improbabile che questa società muoia, potrebbero cambiare i piani di hosting del codice, i prezzi, ecc. O fondersi con un'altra società. Ma è un latte di denaro per loro. E eseguiranno anche il backup dei dati preziosi. Sono affari loro di rimanere sul posto. Lo uso con 3 sviluppatori e il nostro codice esiste su 5 macchine diverse, dove esiste sempre una copia di origine locale che viene sincronizzata su xp dev. XP dev è gratuito se hai solo pochi progetti.
user613326

1
Certo, è improbabile. Tuttavia, non puoi mai essere sicuro al 100% ...
BartoNaz,

Risposte:


19

Sì, questa è esattamente la bellezza di DVCS come Git. Puoi usare un numero qualsiasi di repository diversi con lo stesso stato di quello su bitbucket o github.

Anche la tua copia locale (il repository sul tuo computer) è di solito un clone completo del repository remoto.

L'unica cosa che devi fare per mantenere più repository sincronizzati è estrarre uno (di solito chiamato origine o upstream) e spingere verso le copie di backup.


11
Sfortunatamente non tutto è brillante. Guarda la versione cautelativa di KDE quasi-disastro . In altre parole, assicurarsi che il backup non elimini elementi (rami, repository, ecc.) Che sono stati eliminati sul server di backup.
Jan Hudec,

Non sono ancora sicuro di averlo capito correttamente. Per quanto ho capito, spingere e tirare funziona con una determinata versione. Ma diciamo che ho una versione recente del codice sulla mia macchina funzionante. Ho il repository git sull'host remoto (Bitbucket, Github o qualsiasi altra cosa), che ha una cronologia completa dello sviluppo del codice fino alla versione più recente che ho sulla macchina funzionante (se è stato eseguito il commit). E ho un repository sul NAS vuoto. Posso importare la cronologia completa del codice dall'host remoto sul NAS in modo da disporre di due repository identici in due posizioni e come?
BartoNaz,

2
Clonare il repository remoto, quindi estrarre tutti gli aggiornamenti (tutti i rami) ad intervalli regolari. Un clone git contiene la cronologia, non è come un checkout svn che ha solo l'ultima versione.
Wilbert,

11

Ecco una soluzione testata per il problema: Automatic Sync 2 Remote Git Repositories

Un semplice script per la sincronizzazione di 2 repository Git remoti

Ho cercato sul web uno script semplice che si sincronizzerà. 2 repository remoti ma non sono riuscito a trovare questo script anche se molti sembrano cercarlo! Quindi ho creato 2 semplici repository di test e ho iniziato a testare e creare tale script.

Cosa dovrebbe fare questo script?

Bene, in generale, i passaggi per farlo sono semplici: 1. Clonare il primo repository 1. Aggiungere il secondo come repository remoto aggiuntivo 1. recuperare tutto quello che c'è nel secondo repository 1. spingere il repository locale aggiornato sul 2 repository remoti.

Il problema rimasto è: quali sono le opzioni corrette per tutti i comandi git sopra?

Quindi eccolo qui ...

2repos-sync.sh gisp script

# 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 : questo script non risolve i casi di conflitto tra i contenuti del repository!


Potresti voler menzionare nella tua risposta che la prima cosa da fare è eliminare una directory locale esistente con $ REPO_NAME. Questo sembra importante e potrebbe prevenire la perdita di dati per le persone che copiano semplicemente la soluzione.
Wilbert,

Per accompagnare questo, LibGit2 è utile per questo tipo di cose.
RubberDuck

0

Uso un GitLab privato per archiviare tutti i miei repository, quindi ho solo un'origine da cui spingo e attingo mentre faccio lo sviluppo quotidiano.

Ma, per i progetti open source, GitHub è una community molto più vivace, quindi, se voglio accettare i contributi della community ai miei progetti, uso il sistema web hook di Web GitLab per eseguire il ping di un server che eseguo che quindi aggiorna i miei repository pubblici su GitHub.

Questo mi permette di trattare GitHub come un altro telecomando da cui posso estrarre quando qualcuno contribuisce, quindi unisco localmente -no-ff e c'è un flusso su come tutti i miei repository primari e pubblici distribuiscono le modifiche.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.