Nuestros desarrolladores utilizan una combinación de sistemas operativos basados en Windows y Unix. Por lo tanto, los enlaces simbólicos creados en máquinas Unix se convierten en un problema para los desarrolladores de Windows. En Windows (msysgit), el enlace simbólico se convierte en un archivo de texto con una ruta al archivo al que apunta. En cambio, me gustaría convertir el enlace simbólico en un enlace simbólico real de Windows.
La solución ( actualizada ) que tengo para esto es:
- Escriba una secuencia de comandos posterior al pago que buscará recursivamente archivos de texto de "enlace simbólico".
- Reemplácelos con un enlace simbólico de Windows (usando mklink) con el mismo nombre y extensión que el "enlace simbólico" ficticio
- Ignore este enlace simbólico de Windows agregando una entrada en .git / info / exclude
No he implementado esto, pero creo que este es un enfoque sólido para este problema.
Preguntas:
- ¿Qué inconvenientes, si los hay, observa en este enfoque?
- ¿Es este script posterior al pago incluso implementable? es decir, ¿puedo encontrar recursivamente los archivos ficticios de "enlace simbólico" que crea git?
- ¿Alguien ya ha trabajado en ese guión?
Respuestas:
Puede encontrar los enlaces simbólicos buscando archivos que tengan un modo
120000
, posiblemente con este comando:Una vez que reemplace los enlaces, recomendaría marcarlos como sin cambios
git update-index --assume-unchanged
, en lugar de enumerarlos.git/info/exclude
.fuente
git ls-files -s | grep '^12' | cut -f2
(segunda columna delimitada por tabulaciones; otras columnas están delimitadas por espacios)for f in `git ls-files -s | awk '/120000/{print $4}'`; do git update-index --assume-unchanged $f; done
Estaba haciendo esta misma pregunta hace un tiempo (no aquí, solo en general) y terminé encontrando una solución muy similar a la propuesta de OP. Primero proporcionaré respuestas directas a las preguntas 1 2 y 3, y luego publicaré la solución que terminé usando.
git checkout
paso posterior literal , pero la solución a continuación ha satisfecho mis necesidades lo suficientemente bien como para que no fuera necesario un script literal posterior al pago.La solución:
Nuestros desarrolladores se encuentran en la misma situación que los OP: una mezcla de hosts, repositorios y submódulos similares a Windows y Unix con muchos enlaces simbólicos git, y no hay soporte nativo (todavía) en la versión de lanzamiento de MsysGit para manejar de manera inteligente estos enlaces simbólicos en hosts Windows .
Gracias a Josh Lee por señalar el hecho de que git confirma enlaces simbólicos con un modo de archivo especial
120000
. Con esta información, es posible agregar algunos alias de git que permiten la creación y manipulación de enlaces simbólicos git en hosts de Windows.Crear enlaces simbólicos git en Windows
Uso:,
git add-symlink <source_file_or_dir> <target_symlink>
donde el argumento correspondiente al archivo o directorio fuente debe tomar la forma de una ruta relativa al enlace simbólico objetivo. Puede usar este alias de la misma manera que lo haría normalmenteln
.Por ejemplo, el árbol del repositorio:
Se puede crear en Windows de la siguiente manera:
Reemplazo de enlaces simbólicos git con enlaces duros NTFS + uniones
Uso:
Este alias puede eliminar los enlaces simbólicos de git uno por uno o todo a la vez de una sola vez. Los enlaces simbólicos se reemplazarán por enlaces duros NTFS (en el caso de los archivos) o uniones NTFS (en el caso de los directorios). El beneficio de usar enlaces duros + uniones sobre enlaces simbólicos NTFS "verdaderos" es que no se requieren permisos UAC elevados para poder crearlos.
Para eliminar enlaces simbólicos de submódulos, solo use el soporte incorporado de git para iterar sobre ellos:
Pero, por cada acción drástica como esta, es bueno tener una inversión ...
Restaurar enlaces simbólicos git en Windows
Uso:,
git checkout-symlinks [symlink] [symlink] [...]
que se deshacegit rm-symlinks
, restaurando efectivamente el repositorio a su estado natural (a excepción de sus cambios, que deben permanecer intactos).Y para submódulos:
Limitaciones:
Los directorios / archivos / enlaces simbólicos con espacios en sus rutas deberían funcionar. Pero pestañas o nuevas líneas? YMMV ... (Con esto quiero decir: no hagas eso, porque no funcionará).
Si usted u otras personas se olvidan
git checkout-symlinks
antes de hacer algo con consecuencias potencialmente ampliasgit add -A
, como el depósito local podría terminar en un estado contaminado.Usando nuestro "ejemplo de repositorio" de antes:
Whoops ...
Por esta razón, es bueno incluir estos alias como pasos a realizar para los usuarios de Windows antes y después de construir un proyecto, en lugar de después de finalizar la compra o antes de presionar. Pero cada situación es diferente. Estos alias me han sido lo suficientemente útiles como para que no haya sido necesaria una verdadera solución posterior al pago.
¡Espero que ayude!
Referencias
http://git-scm.com/book/en/Git-Internals-Git-Objects
http://technet.microsoft.com/en-us/library/cc753194
Última actualización: 2019-03-13
mklink
llamadas, por supuesto) - ¡no más Bashisms !add-symlink
alias ahora funciona más como ln (1) y se puede usar desde cualquier directorio del repositorio, no solo desde el directorio raíz del repositorio.rm-symlink
alias (singular) ha sido reemplazado por elrm-symlinks
alias (plural), que ahora acepta múltiples argumentos (o ningún argumento en absoluto, que encuentra todos los enlaces simbólicos en todo el repositorio, como antes) para transformar selectivamente enlaces simbólicos git en enlaces duros + uniones NTFS .checkout-symlinks
alias también se ha actualizado para aceptar múltiples argumentos (o ninguno en absoluto, == todo) para la reversión selectiva de las transformaciones mencionadas anteriormente.Nota final: si bien probé cargar y ejecutar estos alias usando Bash 3.2 (e incluso 3.1) para aquellos que todavía pueden estar atrapados en versiones antiguas por varias razones, tenga en cuenta que versiones tan antiguas como estas son notorias por su analizador loco. Si experimenta problemas al intentar instalar cualquiera de estos alias, lo primero que debe considerar es actualizar su shell (para Bash, verifique la versión con CTRL + X, CTRL + V). Alternativamente, si está tratando de instalarlos pegándolos en su emulador de terminal, es posible que tenga más suerte pegándolos en un archivo y comprándolos en su lugar, por ejemplo, como
¡Buena suerte!
fuente
git add-symlink
receta ha sido fantásticamente valiosa para mí. Muchas gracias.La versión más reciente de git scm (testet 2.11.1) permite habilitar enlaces simbólicos. Pero tienes que clonar el repositorio con los enlaces simbólicos nuevamente
git clone -c core.symlinks=true <URL>
. Debe ejecutar este comando con derechos de administrador. También es posible crear enlaces simbólicos en Windows con mklink. Echa un vistazo a la wiki .fuente
tslint.json
archivo que hace referencia al archivo en el directorio principal todavía contiene../tslint.json
. Lástima, porque realmente parecía la más fácil de todas las soluciones propuestas allí.git clone -c core.symlinks=true <URL>
y en Windows debe ejecutarlo con derechos de administrador.Debería implementarse en msysgit, pero hay dos desventajas:
Hice una búsqueda rápida y se está trabajando activamente en esto, vea el número 224 .
fuente
así como las cosas han cambiado con GIT desde que se publicaron muchas de estas respuestas aquí están las instrucciones correctas para que los enlaces simbólicos funcionen correctamente en Windows a partir de
AGOSTO 2018
1. Asegúrese de que git esté instalado con soporte de enlace simbólico
2. Dile a Bash que cree enlaces duros en lugar de enlaces simbólicos
EDITAR - (carpeta git) /etc/bash.bashrc
AÑADIR AL FONDO -
MSYS=winsymlinks:nativestrict
3. Configure git config para usar enlaces simbólicos
o
NOTA: He intentado agregar esto a la configuración global de git y en este momento no funciona para mí, así que recomiendo agregar esto a cada repositorio ...
4. tirar del repositorio
NOTA: a menos que haya habilitado el modo de desarrollador en la última versión de Windows 10, debe ejecutar bash como administrador para crear enlaces simbólicos
5. Restablezca todos los enlaces simbólicos (opcional) Si tiene un repositorio existente o está utilizando submódulos, puede encontrar que los enlaces simbólicos no se están creando correctamente, de modo que para actualizar todos los enlaces simbólicos en el repositorio puede ejecutar estos comandos.
NOTA: esto restablecerá cualquier cambio desde la última confirmación, así que asegúrese de haber confirmado primero
fuente
Respuesta corta: ahora son compatibles, si puede habilitar el modo desarrollador.
Desde https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/
Fácil de pasar por alto con todos los otros anuncios de la "Actualización del creador", pero si habilita el Modo de desarrollador, puede crear enlaces simbólicos sin privilegios elevados. Es posible que deba volver a instalar git y asegurarse de que la compatibilidad con enlaces simbólicos esté habilitada, ya que no está predeterminada.
fuente
gpedit.msc
->Local Computer Policy
->Computer Configuration
->Windows Settings
->Security Settings
->Local Policies
->User Rights Assignment
ha sido la forma canónica de asignar derechos de usuario comoSeCreateSymbolicLink
y amigos por siglos. Apartentrights.exe
del Kit de recursos o el PowerShell ...Respuesta 2020
mklink
permisosgit config --global core.symlinks true
El cambio de ramas forzará la recreación de enlaces simbólicos faltantes.
Tenga cuidado, el soporte para Symlinks en Windows con algunos otros clientes Git no está completo. Notablemente GitKraken.
fuente
Te sugiero que no uses enlaces simbólicos dentro del repositorio '. Almacene el contenido real dentro del repositorio 'y luego coloque los enlaces simbólicos fuera del repositorio' que apuntan al contenido.
Digamos que está utilizando un repositorio para comparar el alojamiento de su sitio en * nix con el alojamiento en win. Almacene el contenido en su repositorio ', digamos
/httpRepoContent
yc:\httpRepoContent
siendo esta la carpeta que se sincroniza a través de GIT, SVN, etc.Luego, reemplace la carpeta de contenido de su servidor web (
/var/www
yc:\program files\web server\www
{los nombres realmente no importan, edite si es necesario}) con un enlace simbólico al contenido en su repositorio '. Los servidores web verán el contenido como realmente en el lugar "correcto", pero puede usar su control de fuente.Sin embargo, si necesita utilizar enlaces simbólicos con en el repositorio, deberá buscar algo así como algún tipo de scripts de confirmación previa / posterior. Sé que puede usarlos para hacer cosas, como analizar archivos de código a través de un formateador, por ejemplo, por lo que debería ser posible convertir los enlaces simbólicos entre plataformas.
si alguien conoce un buen lugar para aprender cómo hacer estos scripts para los controles de fuente comunes, SVN GIT MG, entonces agregue un comentario.
fuente
Para aquellos que usan CygWin en Vista, Win7 o superior, el
git
comando nativo puede crear enlaces simbólicos "apropiados" que son reconocidos por aplicaciones de Windows como Android Studio . Solo necesita establecer laCYGWIN
variable de entorno para incluirwinsymlinks:native
owinsymlinks:nativestrict
como tal:La desventaja de esto (y una importante) es que el shell CygWin debe ser "Ejecutar como administrador" para que tenga los permisos del sistema operativo necesarios para crear ese tipo de enlaces simbólicos. Sin embargo, una vez que se crean, no se requieren permisos especiales para usarlos . Mientras otro desarrollador no los cambie en el repositorio, a
git
partir de entonces se ejecutará bien con los permisos de usuario normales.Personalmente, uso esto solo para enlaces simbólicos que se navegan por aplicaciones de Windows (es decir, que no son CygWin) debido a esta dificultad adicional.
Para obtener más información sobre esta opción, consulte esta pregunta SO: Cómo hacer un enlace simbólico con cygwin en Windows 7
fuente
Aquí hay un script por lotes para convertir enlaces simbólicos en el repositorio, solo para archivos, basado en la respuesta de Josh Lee. El script con alguna verificación adicional para los derechos de administrador está en https://gist.github.com/Quazistax/8daf09080bf54b4c7641 .
fuente
Uso enlaces sym todo el tiempo entre la raíz de mi documento y el directorio git repo. Me gusta mantenerlos separados. En Windows uso la opción mklink / j. La unión parece dejar que git se comporte normalmente:
>mklink /j <location(path) of link> <source of link>
por ejemplo:
>mklink /j c:\gitRepos\Posts C:\Bitnami\wamp\apache2\htdocs\Posts
fuente
Estaba buscando una solución fácil para lidiar con los enlaces simbólicos de Unix en Windows. Muchas gracias por los alias de Git anteriores. Hay una pequeña optimización que se puede hacer a los enlaces simbólicos rm para que no elimine los archivos en la carpeta de destino en caso de que el alias se ejecute por segunda vez accidentalmente. Observe la nueva condición if en el bucle para asegurarse de que el archivo no sea un enlace a un directorio antes de ejecutar la lógica.
fuente
Un truco simple que usamos es llamar
git add --all
dos veces seguidas.Por ejemplo, nuestro script de confirmación de Windows 7 invoca:
La primera adición trata el enlace como texto y agrega las carpetas para eliminar.
La segunda adición atraviesa el enlace correctamente y deshace la eliminación restaurando los archivos.
Es menos elegante que algunas de las otras soluciones propuestas, pero es una solución simple para algunos de nuestros entornos heredados que agregaron enlaces simbólicos.
fuente