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:
- Acabo de escribir esto y lo probé brevemente en Win7 y Ubuntu, pruébelo primero si es de 2015 y usa Windows 9.
- 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.
- 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:
- Ejecute Git Bash shell como administrador
- Correr
export MSYS=winsymlinks:nativestrict
- 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.