2009-12-11 15 views
17

Vai facile per me, non sono un gran che un uomo a linea di comando ... Abbiamo installato GIT all'interno della nostra rete Windows (usando msysgit & GitExtensions). Ognuno di noi ha i propri repository e noi spingiamo verso un repository "nudo" remoto su uno dei nostri server. Tutto bene.Clone GIT su unità esterna per il backup

Sto tentando di impostare un processo pianificato sul server, che clonerà un repository dall'unità C a un'unità esterna (su F) - avendo qualche difficoltà a farlo funzionare. Posso farlo in BASH relativamente facilmente, ma non sono sicuro di come salvare questo in un file batch che posso quindi scehdule.

Quello che ho finora:

rmdir F:\GitClone /s /q 
mkdir F:\GitClone 
mkdir F:\GitClone\Repo1 
CD /D F:\GitClone\Repo1\ 
GIT CLONE /c/GIT/Repo1/ 

Ho anche provato il seguente per l'ultima riga:

GIT CLONE C:\GIT\Repo1\ 

Ma questo non funziona nemmeno ... Sono un piccolo perplesso e apprezzerebbe un po 'di aiuto. L'unità C contiene nostri repository nudi e l'unità F è il nostro disco esterno che ci scambiamo quotidianamente ...


Diverse risposte qui che sono stati molto utili, grazie. La mia risposta risultante è probabilmente una combinazione di questi, quindi punti per indicare come eseguire uno script di bash e come scrivere script in pull/push.

È necessario riunire questi componenti affinché funzionino, in modo che siano felici quando si inseriscono o disinseriscono diverse unità (ad esempio clonare un repository se non esiste sul disco esterno e quindi estrarre le differenze in caso contrario), ma ciò dovrebbe essere fattibile Grazie a tutti.

risposta

26

prega di notare che git sé è eccellente a copiare solo le modifiche necessarie a un repository clonato.

Se si desidera aggiornare regolarmente una copia del repository, procedere come segue: Creare un repository come repository di backup e quindi inviare ripetutamente tutte le nuove modifiche (non è necessario eliminare il backup precedente).

Ok, cominciamo creando il repo

$ cd /tmp 
$ mkdir myrepo && cd myrepo 
$ touch hi && git add . && git commit -m "bla" 

Quindi, questo è il vostro repository. Ora creiamo il clone: ​​

$ cd /tmp 
$ mkdir backup && cd backup 
$ git --bare init 
Initialized empty Git repository in /tmp/backup/ 

Ora, proviamo ad impostare il tuo repo di backup regolari ...

$ cd /tmp/myrepo 
$ git remote add backup /tmp/backup 
$ git config remote.backup.mirror true 

quindi copiare tutto per il backup:

$ git push backup 
Counting objects: 3, done. 
Writing objects: 100% (3/3), 206 bytes, done. 
Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
To /tmp/backup 
* °new branch§  master -> master 

e vedere se ha funzionato :

$ cd /tmp/backup 
$ git log 
commit d027b125166ff3a5be2d7f7416893a012f218f82 
Author: Niko Schwarz <niko.schwarzàgmail.com> 
Date: Fri Dec 11 12:24:03 2009 +0100 

    hi 

Tad a, sei pronto. Pertanto, tutto ciò che lo script deve fare è pubblicare git push backup. Non c'è esattamente bisogno di gettare ripetutamente il vecchio backup.

L'alternativa è che si può avere rsync fare tutto per voi:

rsync -av rsync://rsync.samba.org/ftp/unpacked/rsync /dest/dir/ 

utente Offby aggiunge: A partire dalla versione 1.5.4, "git remote add" prende un'opzione "--mirror", che ti salva sia dal dover "git config remote.origin.mirror true", sia dal dover passare --mirror a "git push".

+0

perché stai rsinciando da un semplice repo? Non avrà file ritirati. Se si --exclude = .git /, allora non si sta per niente copiando. Inoltre, perché il repositroy spinge al backup? Perché il backup non parte dal repository? – Pod

+0

Non lo sono, sto proponendo due modi diversi: rsincronizzare o copiare su un semplice repository per la copia. E a mio parere, è più naturale spingere un backup piuttosto che tirarlo. – nes1983

+0

Ah, ora capisco cosa intendi, scusa, la dichiarazione di esclusione è entrata per sbaglio. – nes1983

4

Si può sempre e solo programmare mybashbackupscript.sh bash.exe

In ogni caso, in termini finestre:

rmdir F:\GitClone /s /q 
mkdir -p F:\GitClone\Repo1 
copy c:\GIT\Repo1\.git F:\GitClone\Repo1\.git 

git clone in realtà non fare nulla più elaborato di quello.

modifica: come indicato da altri, è probabilmente meglio creare un nuovo repository di backup e semplicemente tirare/recuperare. Potrai evitare eventuali problemi con l'accesing .git :)

+0

Questo è un po il mio pensiero al minuto. – Paddy

4

Perché git comando è po 'strano è necessario utilizzare call per eseguire qualsiasi comando Git da un file batch:

rmdir F:\GitClone /s /q 
mkdir F:\GitClone 
CD /D F:\GitClone\ 
call GIT CLONE c/GIT/Repo1/ 
+0

questo era il mio problema pure –

1

dispiace, non posso 'commento commenti, ma stavo pensando anche a copiare il .git, ma cosa succede se il .git viene copiato durante un pull?

In ogni caso, perché copiare tutte le cose come si potrebbe ritirare i delta di volta in volta?

inizializzazione di backup: (in F: \ GitClone \ Repo1 vuoto)

git init 
git add remote origin /c/GIT/Repo1 

Allora la vostra "script di backup delta" sarebbe solo fare:

cd /f/GitClone/Repo1 
git fetch origin 
0

Perché si elimina il clone tutto il tempo? Qual è il punto di clonazione di un repository esistente quando si desidera copiare il file?

Basta creare il repo sul disco esterno (usando git clonevolta), e quindi eseguire git pull su di esso regolarmente.

+0

Queste unità vengono scambiate dentro e fuori su base giornaliera - Voglio assicurarmi che venga creata se non già presente. – Paddy

0

Problema risolto:

h: (flash drive) 
cd \ 
mkdir YourProject 
cd YourProject 
git init 
git remote add origin [email protected]:user/YourProject.git 
git remote add local C:\w\YourProject 
git pull origin master 
git push local master