2009-05-12 22 views
29

Si realizo una copia de una carpeta rastreada usando rsync -a o cp -R, ¿puedo usar la copia como si fuera un clon git, o eso ocasionará todo tipo de problemas extraños? Todo esto se ejecuta en mi computadora, por lo que nadie más está accediendo al repositorio.¿Es seguro usar un copiado git repo?

Obviamente, el directorio de git-cloned sabe de dónde se copió, así que puedo hacer git pull sin especificar una fuente, pero suponiendo que estoy dispuesto a vivir sin eso, ¿hay algo de lo que deba preocuparme?

Como experimento, creé un pequeño proyecto, clone d y lo edité rsync y diff las carpetas resultantes. Aquí están los resultados:

[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 

Hay un poco de una diferencia, pero la mayor parte parece ser acerca de la referencia al origen. ¿Estoy en lo cierto?

+0

No sé la respuesta, pero supongo que estaría bien. Tengo mucha curiosidad de por qué necesitas (¿quieres?) Sin embargo. –

+1

Ya me surgió la necesidad dos veces, una para una carpeta de respaldo en la que realicé algunos cambios, y una cuando quise clonar un repositorio que estaba en una máquina Windows detrás de una NAT que no tenía sshd ... pero sobre todo, quiero tener una mejor comprensión de cómo funciona Git. – itsadok

Respuesta

27

Es seguro.

La diferencia en el uso de "git clone" es que configura automáticamente el repositorio de origen, por lo que puede usar fácilmente "git pull" y "git push" para sincronizar los dos repositorios. Además, "git clone" no copia los registros, el índice y otra configuración local en un repositorio. Solo copia el historial de versiones del repositorio (e incluso eso se puede almacenar en el nivel de bytes de forma diferente, porque Git comprime cada tanto su base de datos cuando usa "git gc").

Las diferencias que ve en su ejemplo se deben a que rsnc copió también el índice del directorio de trabajo, los registros y porque rsync-copy no configuró el origen remoto. Hay bastantes archivos de configuración y de registro que son locales para un repositorio. Pero no hay peligro al copiarlos directamente, por ejemplo al restaurar copias de seguridad o mover el repositorio a otro directorio/disco duro/máquina.

+2

Otra forma de decir esto es que git clone clona por completo el directorio "objects" cuando se usa para clonar un repositorio en la misma máquina --- solo usa cpio para copiar todo, convirtiendo a enlaces duros si el destino es el mismo sistema de archivos. Todo lo que está fuera del directorio de objetos es de todos modos información local. Simplemente copiar esos al por mayor (a la cp -R) en lugar de recrearlos (que es lo que hace el clon git) debería ser bastante seguro. Siempre que los ganchos copiados no hagan nada demasiado extraño, por supuesto. – araqnid

4

Al clonar repositorio de otra persona, que, básicamente, sólo copias el contenido de este directorio a su computadora .

Del bien real Git Internals (Scott Chacon) from Peepcode Press. (Página 44) Así que me falta la referencia al origen en lo que a mí respecta/ya veo.

Con mis mejores deseos.

+3

Supongo que quiere decir peepcode, no peedcode. :) –

1

Es exactamente lo mismo, bueno, casi, si quieres lo mismo en 'proyecto3' acaba de hacer:

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