2009-05-12 21 views
29

Se faccio una copia di una cartella tracciata usando rsync -a o cp -R, posso quindi usare la copia come se fosse un clone git, o causerà tutti i tipi di problemi strani? Tutto questo è in esecuzione sul mio computer, quindi nessun altro accede al repository.È sicuro utilizzare un repository git copiato?

Ovviamente, la directory git-cloned sa da dove è stata copiata, quindi posso fare git pull senza specificare una fonte, ma supponendo che sono disposto a vivere senza, c'è qualcosa di cui devo preoccuparmi?

Come esperimento, ho creato un piccolo progetto, clone it e rsync ed esso e diff e le cartelle risultanti. Ecco i risultati:

[email protected] ~ 
$ git clone project/.git project2 
Initialized empty Git repository in /home/itsadok/project2/.git/ 

[email protected] ~ 
$ rsync -a project/ project3/ 

[email protected] ~ 
$ diff -r project2 project3 
Only in project3/.git: COMMIT_EDITMSG 
diff -r project2/.git/config project3/.git/config 
7,12d6 
< [remote "origin"] 
<  url = /home/itsadok/project/.git 
<  fetch = +refs/heads/*:refs/remotes/origin/* 
< [branch "master"] 
<  remote = origin 
<  merge = refs/heads/master 
Files project2/.git/index and project3/.git/index differ 
diff -r project2/.git/logs/HEAD project3/.git/logs/HEAD 
1c1 
< 0000000000000000000000000000000000000000 bf6be23d68d0ede45aca7479795693bfba76e73a itsadok <[email protected](none)> 1242131284 +0300  clone: from /home/itsadok/project/.git 
--- 
> 0000000000000000000000000000000000000000 bf6be23d68d0ede45aca7479795693bfba76e73a itsadok <[email protected](none)> 1242131066 +0300  commit (initial): first commit 
diff -r project2/.git/logs/refs/heads/master project3/.git/logs/refs/heads/master 
1c1 
< 0000000000000000000000000000000000000000 bf6be23d68d0ede45aca7479795693bfba76e73a itsadok <[email protected](none)> 1242131284 +0300  clone: from /home/itsadok/project/.git 
--- 
> 0000000000000000000000000000000000000000 bf6be23d68d0ede45aca7479795693bfba76e73a itsadok <[email protected](none)> 1242131066 +0300  commit (initial): first commit 
Only in project2/.git/logs/refs: remotes 
Only in project2/.git: packed-refs 
Only in project2/.git/refs: remotes 

C'è un po 'di differenza, ma la maggior parte di esso sembra essere circa il riferimento all'origine. Ho ragione?

+0

non so la risposta, ma direi che sarebbe bene. Sono molto curioso del perché tu abbia bisogno di (vuoi?). –

+1

La necessità è sorta per me già due volte, una volta per una cartella di backup su cui ho apportato alcune modifiche, e una volta quando volevo clonare un repository che si trovava su una macchina Windows dietro un NAT che non aveva sshd su di esso ... ma soprattutto, voglio avere una migliore comprensione di come funziona git. – itsadok

risposta

27

È sicuro.

La differenza nell'utilizzo di "git clone" è che esso imposta automaticamente il repository di origine, in modo da poter usare facilmente "git pull" e "git push" per sincronizzare i due repository. Inoltre "git clone" non copia i log, l'indice e altre configurazioni locali in un repository. Copia solo la cronologia delle versioni del repository (e anche quella può essere memorizzata a livello di byte in modo diverso, perché ogni tanto Git comprime il suo database quando usa "git gc").

Queste differenze che vedete nell'esempio sono perché rsnc copiò anche l'indice di directory di lavoro, i registri e perché la copia rsync non ha impostato l'origine remota. Ci sono molti file di configurazione e di log che sono locali in un repository. Ma non vi è alcun pericolo nel copiarli direttamente, ad esempio quando si ripristinano i backup o si sposta il repository in un'altra directory/disco rigido/macchina.

+2

Un altro modo di mettere questo è che git clone infatti clona completamente la directory "objects" quando è usata per clonare un repository sulla stessa macchina --- usa solo cpio per copiare tutto, convertendo in hard link se il la destinazione è lo stesso file system. Tutto al di fuori della directory degli oggetti è comunque informazione locale. Copiare semplicemente quelli all'ingrosso (a la cp-R) invece di ricrearli (che è ciò che fa il clone di git) dovrebbe essere abbastanza sicuro. A condizione che i ganci copiati non facciano nulla di troppo bizzarro, ovviamente. – araqnid

4

Quando si duplica repository di qualcun altro , fondamentalmente solo copie il contenuto di questo elenco per il computer .

Dal vero Git Internals (Scott Chacon) from Peepcode Press. (Pagina 44) Quindi, per quanto mi riguarda, vedo solo il riferimento all'origine/vedo.

Con i migliori saluti.

+3

Immagino tu intenda peepcode, non peedcode. :) –

1

E 'esattamente lo stesso, beh, quasi, se si desidera che lo stesso in 'progetto3' basta fare:

git remote add origin /home/itsadok/project 
git branch -f master origin/master 
Problemi correlati