Saltar al contenido

Git Bash Shell no puede crear enlaces simbólicos

Solución:

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

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

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

Ahora, no podemos hacer cmd /C, porque MSYSGIT fornicará con este argumento y lo convertirá en C:. Además, no tenga la tentación de usar /K, solo funciona si no tienes un K: conducir.

Entonces, aunque 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

Además: tenga en cuenta que incluí /D porque solo me interesan los enlaces simbólicos de directorios; Windows tiene esa distinción. Con mucho esfuerzo, podrías escribir un ln() { ... } función que envuelve la API de Windows y sirve como una solución completa, pero eso … se deja como un ejercicio para el lector.


Editar: 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ébelo primero si es de 2015 y usa 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 iniciar el shell Git Bash como administrador, ya que en Windows solo los administradores pueden crear los enlaces simbólicos. Entonces, para hacer tar -xf trabajar y crear los enlaces simbólicos necesarios:

  1. Ejecute Git Bash shell como administrador
  2. Correr export MSYS=winsymlinks:nativestrict
  3. Ejecutar alquitrán

Una solución alternativa es ejecutar mklink de Bash. Esto también le permite crear un enlace simbólico o un cruce.

Tenga cuidado de enviar el mklink comando como un solo argumento para 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 duros, uniones y puntos de montaje de volumen. ¡Lo he estado usando durante años!

  • http://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html

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 enlazar simbólicamente algunas carpetas hinchadas que no necesitan estar en SSD en otras unidades. Utilizo el WinDirStat gratuito para encontrar los acaparadores de espacio en disco.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *