¿Cómo maneja git los enlaces simbólicos?

Si tengo un archivo o directorio que es un enlace simbólico y lo coloco en el repositorio de Git, ¿qué sucede?

Yo sugeriría que lo deje como un enlace simbólico hasta que se elimine el archivo, y luego, si extrae el archivo de la versión anterior, simplemente crea un archivo normal.

¿Qué hace cuando borro el archivo al que hace referencia? ¿Se acaba de arreglar el enlace colgante?

1369
05 июня '09 в 9:53 2009-06-05 09:53 Alex está programado para el 05 de junio de 2009 a las 9:53 2009-06-05 09:53
@ 3 respuestas

Git simplemente almacena el contenido del enlace (es decir, la ruta al objeto del sistema de archivos al que hace referencia) en "blob", como se hace para un archivo normal. A continuación, almacena el nombre, el modo y el tipo (incluido el hecho de que es un enlace simbólico) en el objeto del árbol que representa el directorio que lo contiene.

Cuando extrae un árbol que contiene un enlace, restaura el objeto como un enlace simbólico, independientemente de si el objeto del sistema de archivos de destino existe o no.

Si elimina un archivo al que se hace referencia mediante un enlace simbólico, no afectará al enlace simbólico administrado por Git. Tendrás un enlace colgante. El usuario puede eliminar o modificar el enlace para indicar que algo es válido, si es necesario.

1146
05 июня '09 в 10:01 2009-06-05 10:01 CB Bailey da la respuesta el 5 de junio de 2009 a las 10:01, 2009-06-05 10:01

Tl; DR: Los datos a los que hace referencia el enlace simbólico no se almacenan en el repositorio.


Puede averiguar qué hace Git con un archivo al ver qué hace cuando lo agrega al índice. El índice es similar al prefijo. Después de corregir el índice, puede usar git checkout para devolver todo lo que estaba en el índice al directorio de trabajo. Entonces, ¿qué hace Git cuando agrega un enlace simbólico al índice?

Para averiguarlo, primero haga un enlace simbólico:

 $ ln -s /path/referenced/by/symlink symlink 

Git no sabe acerca de este archivo todavía. git ls-files permite verificar su índice (como la de las stat ):

 $ git ls-files -s ./symlink [nothing] 

Ahora agregue el contenido del enlace simbólico al almacén de objetos de Git, agregándolo al índice. Cuando agrega un archivo al índice, Git guarda su contenido en el almacenamiento de objetos de Git.

 $ git add ./symlink 
border=0

Entonces, ¿qué se ha añadido?

 $ git ls-files -s ./symlink 120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink 

Un hash es un enlace a un objeto empaquetado que se creó en el almacén de objetos Git. Puede verificar este objeto mirando .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c en la raíz de su repositorio. Este archivo es lo que Git almacena y lo que puede extraer de su repositorio cuando agrega y confirma un enlace simbólico. Si examinas este archivo, verás que es muy pequeño. No almacena el contenido del archivo asociado.

(Tenga en cuenta que 120000 es el modo de archivo especificado en la salida de ls-files . Será algo así como 100644 para un archivo normal).

Pero, ¿qué hace Git con este objeto cuando lo recuperas del almacenamiento y dentro de su sistema de archivos? Depende de la configuración de core.symlinks . Desde man git-config :

core.symlinks

Si es falso, los enlaces simbólicos se extraen en forma de pequeños archivos simples que contienen el texto del enlace.

Por lo tanto, al tener un enlace simbólico en el repositorio, al recuperar, se obtiene un archivo de texto con un enlace a la ruta completa del sistema de archivos o el enlace simbólico correcto, según el valor de configuración core.symlinks .

En cualquier caso, los datos a los que hace referencia el enlace simbólico no se almacenan en el repositorio.

172
13 сент. Respuesta dada por Dmitry Minkovsky 13 de septiembre 2013-09-13 20:06 '13 a las 20:06 2013-09-13 20:06

Nota del editor: esta publicación puede contener información obsoleta. Por favor, vea los comentarios y esta pregunta con respecto a los cambios en Git desde 1.6.1.

Directorios simbólicos:

Es importante tener en cuenta lo que sucede cuando hay un directorio que es un enlace flexible. Cualquier actualización de Git Pull actualiza el enlace y lo convierte en un directorio normal. Esto es lo que aprendí de la manera difícil. Algunas ideas aquí y aquí.

un ejemplo

Hasta

  ls -l lrwxrwxrwx 1 admin adm 29 Sep 30 15:28 src/somedir -> /mnt/somedir 

git add/commit/push

 It remains the same 

Después de git pull y algunas actualizaciones encontradas

  drwxrwsr-x 2 admin adm 4096 Oct 2 05:54 src/somedir 
143
02 окт. La respuesta se da Shekhar 02 oct. 2009-10-02 09:16 '09 a las 9:16 am 2009-10-02 09:16

Otras preguntas acerca de las etiquetas o Haz una pregunta