¿Cómo maneja Git los enlaces simbólicos?
version-control symlink (3)
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 de enlaces simbólicos:
Es importante tener en cuenta lo que sucede cuando hay un directorio que es un enlace flexible. Cualquier extracción de Git con una actualización elimina el enlace y lo convierte en un directorio normal. Esto es lo que aprendí de manera difícil. Algunas ideas here y here.
Ejemplo
antes de
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
Si tengo un archivo o directorio que es un enlace simbólico y lo confirmo en un repositorio Git, ¿qué sucede con él?
Asumiría que lo deja como un enlace simbólico hasta que se elimine el archivo y luego, si retira el archivo de una versión anterior, simplemente crea un archivo normal.
¿Qué hace cuando borro el archivo al que hace referencia? ¿Se acaba de cometer el enlace que cuelga?
Git simplemente almacena el contenido del enlace (es decir, la ruta del objeto del sistema de archivos al que se vincula) en un ''blob'' como lo haría para un archivo normal. Luego 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 su directorio que lo contiene.
Cuando selecciona un árbol que contiene el 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 el archivo al que hace referencia el enlace simbólico, no afectará de ninguna manera al enlace simbólico controlado por Git. Tendrás una referencia colgando. Depende del usuario eliminar o cambiar el enlace para que apunte a algo válido si es necesario.
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 como un pre-commit. Con el índice confirmado, 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, hacer un enlace simbólico:
$ ln -s /Path/referenced/by/symlink symlink
Git no sabe acerca de este archivo todavía. git ls-files
permite inspeccionar su índice ( -s
imprime un resultado similar a la stat
):
$ git ls-files -s ./symlink
$
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 almacena su contenido en el almacén de objetos de Git.
$ git add ./symlink
Entonces, ¿qué se agregó?
$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink
$
El hash es una referencia al objeto empaquetado que se creó en el almacén de objetos Git. Puede examinar este objeto si busca en .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
.
El 120000
es el modo de archivo. Sería algo así como 100644
para un archivo normal y es el modo especial para enlaces. Desde man git-config
:
core.symlinks
Si es falso, los enlaces simbólicos se verifican como pequeños archivos simples que contienen el texto del enlace. git-update-index (1) y git-add (1) no cambiarán el tipo grabado al archivo normal.
Use git cat-file -p
para imprimir el contenido de forma bonita:
$ git cat-file -p 1596f9db1
/Path/referenced/by/symlink
Entonces, eso es lo que Git hace con un enlace simbólico: cuando git checkout
del enlace simbólico, o bien obtiene un archivo de texto con una referencia a una ruta completa del sistema de archivos, o un enlace simbólico, según la configuración. Los datos a los que hace referencia el enlace simbólico no se almacenan en el repositorio.