2011-12-12 12 views
22

Supongamos que tengo un archivo fname que es un enlace simbólico a un archivo de otro repositorio/proyecto, digamos ../../proj2/fname.git commit symlink como un archivo normal

¿Hay alguna manera de agregar/confirmar fname como un archivo normal?

Parece que, de forma predeterminada, git proporciona el modo de archivo 120000 y establece la ruta al archivo vinculado como contenido blob.

Lo sé porque git ls-tree muestra el modo 120000 para el archivo, y git cat-file -p muestra ../../proj2/fname como contenido del blob.

+0

Hola, ¿puedes actualizar los pasos sobre symlinkinf a file using Git? –

Respuesta

13

No, Git sabe que es un enlace simbólico. Sería algo peligroso para Git pretender lo contrario, ya que terminaría escribiendo en los archivos fuera del del repositorio. Seguirlo como un enlace simbólico es exactamente el comportamiento previsto.

+2

Espero que el comportamiento de escritura en este caso sea eliminar el enlace simbólico y reemplazarlo con un archivo normal. – hasen

+2

@hasenj: Si eso es lo que desea, elimine el enlace simbólico y reemplácelo con una copia del archivo vinculado. Su comportamiento "esperado" implica que Git modifique un archivo al ... agregar? ¿cometer? Eso tampoco es bueno. – Cascabel

+1

Es más probable que sea útil tener enlaces simbólicos apuntando a su repositorio de git. Ese sería el caso si tuviera un repositorio para su configuración de un sistema y luego hubiera reemplazado los archivos de configuración gestionados de git con enlaces a los archivos en el repositorio desprotegido. – LovesTha

3

En Windows, puede hacer lo que quiera con una unión

Por ejemplo, los programas suelen mantener un archivo de configuración en algún lugar en el sistema, pero me gustaría al control de versiones en mi repositorio. No puedo mover el archivo, y no quiero hacer duplicados ni nada

Si ponemos un acceso directo de Windows en el directorio del repositorio, lo verá como un único archivo binario; no es un directorio que apunta a todos los archivos reales que desea incluir

Lo que necesitamos es la capacidad de poner algo como un acceso directo de Windows en el repositorio, pero que Git va a tratar como otra carpeta:

cd /location/of/my/repo/ 
mklink /j "_linkTo_VimSettings" "C:\Program Files (x86)\Vim" 
+0

¿Qué sucede si fusiona un cambio desde el flujo ascendente? ¿Git modificará el contenido de la fuente? Al igual que Jefromi menciona en [otra respuesta] (http://stackoverflow.com/a/8470365/109618), eso sería peligroso. –

32

Si desea que aparezca el archivo en lugar del enlace, probablemente debería usar el comando ln para crear un enlace físico en lugar de un enlace simbólico (ln -s).

Al hacer un enlace físico, puede hacer que el mismo archivo aparezca bajo dos directorios diferentes, por lo que al cambiarlo a través de cualquiera de los enlaces se reflejarán los cambios mediante ambos enlaces, y el archivo se ubicará en ambos directorios, por lo que ser rastreado por git.

Espero que el comando mklink /j de Windows en Bukov's answer lo haga, pero realmente no lo sé en absoluto.

+3

Esta respuesta me parece más útil que la de @Jefromi. – JohnAllen

+1

Debe tenerse en cuenta que los enlaces duros con 'ln' solo funcionan para archivos, pero no para directorios. – BillyTom

+0

¡Exactamente lo que busqué! ¡Felicitaciones a los sistemas UNIX! – blackjacx