Si tengo un archivo o directorio que es un enlace simbólico y lo envío a un repositorio de Git, ¿qué le sucede?
Supongo 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? ¿Solo compromete el enlace colgante?
git
version-control
symlink
Alex
fuente
fuente
.gitignore
ve el enlace simbólico como un archivo, no como una carpeta.../..
según sea necesario.git pull
crea un archivo en lugar de un enlace simbólico, intente ejecutar su cliente Git como administrador.Respuestas:
Git simplemente almacena el contenido del enlace (es decir, la ruta del objeto del sistema de archivos al que se vincula) en un 'blob' tal como lo haría para un archivo normal. Luego almacena el nombre, modo y tipo (incluido el hecho de que es un enlace simbólico) en el objeto de árbol que representa su directorio contenedor.
Cuando desprotege 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 afecta de ninguna manera al enlace simbólico controlado por Git. Tendrás una referencia colgante. Depende del usuario eliminar o cambiar el enlace para señalar algo válido si es necesario.
fuente
core.symlinks
variable de configuración en falso, y los enlaces simbólicos se verían como pequeños archivos de texto sin formato que contienen el texto del enlace.symlinks = false
con ellas.Puede averiguar qué hace Git con un archivo al ver qué hace cuando lo agrega al índice. El índice es como una confirmación previa. Con el índice comprometido, puede usar
git checkout
para traer todo lo que estaba en el índice nuevamente al directorio de trabajo. Entonces, ¿qué hace Git cuando agrega un enlace simbólico al índice?Para averiguarlo, primero, haga un enlace simbólico:
Git aún no conoce este archivo.
git ls-files
le permite inspeccionar su índice (-s
impresionesstat
como salida):Ahora, agregue el contenido del enlace simbólico al almacén de objetos Git agregándolo al índice. Cuando agrega un archivo al índice, Git almacena su contenido en el almacén de objetos de Git.
Entonces, ¿qué se agregó?
El hash es una referencia al objeto empaquetado que se creó en el almacén de objetos Git. Puede examinar este objeto si busca
.git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
en la raíz de su repositorio. Este es el archivo que Git almacena en el repositorio, que luego puede consultar. Si examina este archivo, verá que es muy pequeño. No almacena el contenido del archivo vinculado.(Tenga en
120000
cuenta que el modo aparece en lals-files
salida. Sería algo así como100644
para un archivo normal).Pero, ¿qué hace Git con este objeto cuando lo revisa desde el repositorio y lo ingresa a su sistema de archivos? Depende de la
core.symlinks
configuración. Deman git-config
:Entonces, con un enlace simbólico en el repositorio, al finalizar la compra, obtiene un archivo de texto con una referencia a una ruta completa del sistema de archivos, o un enlace simbólico adecuado, dependiendo del valor de la
core.symlinks
configuración.De cualquier manera, los datos a los que hace referencia el enlace simbólico no se almacenan en el repositorio.
fuente
Directorios con enlaces simbólicos:
Es importante tener en cuenta lo que sucede cuando hay un directorio que es un enlace suave. 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 aquí y aquí.
Ejemplo
antes de
git add/commit/push
Después
git pull
Y algunas actualizaciones encontradasfuente