que para mingw64 here gui msysgit msys

msysgit - mingw64 - github para windows



Git Bash Shell no logra crear enlaces simbólicos (5)

Cuando intento crear un enlace simbólico desde el shell de Git Bash, siempre falla:

$ ln -s /c/Users/bzisad0/Work testlink ln: creating symbolic link `testlink'' to `/c/Users/bzisad0/Work'': Permission denied

Lo único que hace, además de dar el mensaje de error, es crear un directorio vacío llamado (en este caso) testlink .

No veo ningún problema con el ejecutable ln . Por ejemplo, es de mi propiedad y está marcado como ejecutable:

$ which ln /bin/ln $ ls -hal /bin/ln -rwxr-xr-x 1 BZISAD0 Administ 71k Sep 5 11:55 /bin/ln

También poseo el directorio actual ( ~ , que es /c/Users/bzisad0 ):

$ ls -dhal . drwxr-xr-x 115 BZISAD0 Administ 40k Sep 5 12:23 .

Tengo derechos administrativos, y he intentado abrir el shell de Git Bash con "Ejecutar como administrador", pero eso no hace ninguna diferencia.

He intentado abrir las propiedades de Windows para ln.exe y configurar el Nivel de privilegio para "Ejecutar este programa como administrador", pero eso no ayuda.

Ingresé a Seguridad -> Propiedades avanzadas en Windows y me hice (en lugar del grupo Administradores) el propietario, pero eso tampoco soluciona nada.

Estoy en una pérdida. No sé si este mensaje de error viene en última instancia de ln , de Bash o de Windows, o de cómo podría carecer del permiso. ¿Cómo puedo llegar al fondo de esto?



Dado que este es uno de los enlaces principales que aparecen al buscar la creación de enlaces simbólicos en Msys o git bash, encontré que la respuesta era agregar el set MSYS=winsymlinks:native al llamar a git-cmd.exe (ejecuto ConEmu) o no comentar. misma línea en el msys2_shell.bat


Es posible, aunque extremadamente torpe, crear un enlace simbólico en MSYSGIT.

Primero, debemos asegurarnos de que estamos en Windows. Aquí hay una función de ejemplo para verificar que:

windows() { [[ -n "$WINDIR" ]]; }

Ahora, no podemos hacer cmd /C , porque MSYSGIT fornicará con este argumento y lo convertirá en C: Además, no se sienta tentado a usar /K , solo funciona si no tiene una unidad K: .

Entonces, si bien reemplazará este valor en los argumentos del programa, no lo hará en heredocs. Podemos usar esto para nuestra ventaja:

if windows; then cmd <<< "mklink /D /"${link%/}/" /"${target%/}/"" > /dev/null else ln -s "$target" "$link" fi

También: tenga en cuenta que incluí /D porque solo me interesan los enlaces simbólicos del directorio; Windows tiene esa distinción. Con mucho esfuerzo, podría escribir una función ln() { ... } que envuelva la API de Windows y sirva como una solución completa, pero que ... quede como un ejercicio para el lector.

Edición: como agradecimiento por la respuesta aceptada, aquí hay una función más completa.

# We still need this. windows() { [[ -n "$WINDIR" ]]; } # Cross-platform symlink function. With one parameter, it will check # whether the parameter is a symlink. With two parameters, it will create # a symlink to a file or directory, with syntax: link $linkname $target link() { if [[ -z "$2" ]]; then # Link-checking mode. if windows; then fsutil reparsepoint query "$1" > /dev/null else [[ -h "$1" ]] fi else # Link-creation mode. if windows; then # Windows needs to be told if it''s a directory or not. Infer that. # Also: note that we convert `/` to `/`. In this case it''s necessary. if [[ -d "$2" ]]; then cmd <<< "mklink /D /"$1/" /"${2///////}/"" > /dev/null else cmd <<< "mklink /"$1/" /"${2///////}/"" > /dev/null fi else # You know what? I think ln''s parameters are backwards. ln -s "$2" "$1" fi fi }

También tenga en cuenta algunas cosas:

  1. Acabo de escribir esto y lo probé brevemente en Win7 y Ubuntu, pruébalo primero si eres de 2015 y usas Windows 9.
  2. NTFS tiene puntos de análisis y puntos de unión. Elegí puntos de análisis porque es más un enlace simbólico real y funciona para archivos o directorios, pero los puntos de unión tendrían la ventaja de ser una solución utilizable en XP, excepto que es solo para directorios.
  3. Algunos sistemas de archivos, los FAT en particular, no admiten enlaces simbólicos. Las versiones modernas de Windows ya no admiten el arranque desde ellas, pero Windows y Linux pueden montarlas.

Función de bonificación: eliminar un enlace.

# Remove a link, cross-platform. rmlink() { if windows; then # Again, Windows needs to be told if it''s a file or directory. if [[ -d "$1" ]]; then rmdir "$1"; else rm "$1" fi else rm "$1" fi }


Para mi configuración, es Git para Windows 2.11.0 instalado en Windows 8.1 export MSYS=winsymlinks:nativestrict hace el truco como se explica aquí: https://github.com/git-for-windows/git/pull/156 Es importante para iniciar el shell de Git Bash como administrador, ya que solo en Windows los administradores podrían crear los enlaces simbólicos. Entonces, para hacer que tar -xf funcione y crear los enlaces simbólicos requeridos:

  1. Ejecuta el shell de Git Bash como administrador
  2. Ejecute export MSYS=winsymlinks:nativestrict
  3. Correr tar

Una solución es ejecutar mklink desde Bash. Esto también le permite crear un enlace simbólico o una unión .

Tenga cuidado de enviar el comando mklink como un único argumento a cmd ...

cmd /c "mklink link target"

Aquí están las opciones para mklink ...

$ cmd /c mklink Creates a symbolic link. MKLINK [[/D] | [/H] | [/J]] Link Target /D Creates a directory symbolic link. Default is a file symbolic link. /H Creates a hard link instead of a symbolic link. /J Creates a Directory Junction. Link specifies the new symbolic link name. Target specifies the path (relative or absolute) that the new link refers to.

Si desea crear enlaces a través de una GUI en su lugar ... Recomiendo Link Shell Extension, que es un complemento del Explorador de Windows para crear enlaces simbólicos, enlaces físicos, uniones y puntos de montaje de volumen. ¡Lo he estado usando por años!

Los enlaces simbólicos pueden salvarle la vida si tiene una unidad SSD más pequeña en la unidad C: de su sistema y necesita vincular algunas carpetas hinchadas que no necesitan estar apagadas en otras unidades. Utilizo el WinDirStat gratuito para encontrar los cerdos de espacio en disco.