Git Bash Shell无法创build符号链接
当我尝试从Git Bash shell创build符号链接时,它每次都会失败:
$ ln -s /c/Users/bzisad0/Work testlink ln: creating symbolic link `testlink' to `/c/Users/bzisad0/Work': Permission denied
除了提供错误信息之外,它唯一做的是创build一个名为testlink
的空目录(在本例中)。
我没有看到任何可执行文件的问题。 例如,它由我拥有并标记为可执行文件:
$ which ln /bin/ln $ ls -hal /bin/ln -rwxr-xr-x 1 BZISAD0 Administ 71k Sep 5 11:55 /bin/ln
我也拥有当前目录( ~
,这是/c/Users/bzisad0
):
$ ls -dhal . drwxr-xr-x 115 BZISAD0 Administ 40k Sep 5 12:23 .
我有pipe理权限,我试过用“以pipe理员身份运行”打开Git Bash shell,但这没有什么区别。
我已经尝试打开ln.exe
的Windows属性, ln.exe
特权级别设置为“以pipe理员身份运行此程序”,但这并没有帮助。
我进入了Windows的安全 – >高级属性,使自己(而不是pipe理员组)的所有者,但是这也不能解决任何问题。
我不知所措 我不知道这个错误信息最终是来自Bash,还是来自Windows,或者我怎么可能缺less许可。 我怎样才能做到这一点?
尽pipe非常尴尬,但在MSYSGIT中创build符号链接也是可能的。
首先,我们需要确保我们在Windows上。 这里有一个示例函数来检查:
windows() { [[ -n "$WINDIR" ]]; }
现在,我们不能这样做cmd /C
,因为MSYSGIT将会使用这个参数,并把它变成C:
:。 另外,不要试图使用/K
,它只适用于没有K:
驱动器的情况。
所以虽然它将取代程序参数的这个值,但它不会在heredocs上。 我们可以利用这个优势:
if windows; then cmd <<< "mklink /D \"${link%/}\" \"${target%/}\"" > /dev/null else ln -s "$target" "$link" fi
另外:请注意,我包含/D
因为我只对目录符号链接感兴趣; Windows有这样的区别。 通过大量的努力,你可以编写一个ln() { ... }
函数来封装Windows API,并作为一个完整的插件解决scheme,但是这只是给读者一个练习。
编辑:作为接受的答案感谢,这是一个更全面的function。
# 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 }
还要注意几件事情:
- 我刚刚写了这个,并在Win7和Ubuntu上进行了简短的testing,如果你是从2015年开始使用Windows 9的话,请先试一试。
- NTFS具有重parsing点和交接点。 我select重新parsing点是因为它更像是一个实际的符号链接,适用于文件或目录,但是交叉点在XP中有一个可用的解决scheme,除了它只是用于目录。
- 一些文件系统,尤其是FAT文件系统,不支持符号链接。 现代Windows版本不支持从它们开始,但Windows和Linux可以挂载它们。
奖金function:删除链接。
# 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 }
我相信在msysGit附带的ln
只是试图复制它的参数,而不是摆弄链接。 这是因为链接只能在NTFS文件系统上工作,而MSYS团队不想重新实现ln。
例如,参见http://mingw.5.n7.nabble.com/symbolic-link-to-My-Documents-in-MSYS-td28492.html
解决方法是从Bash运行mklink
。 这也使您可以创build一个符号链接或连接点 。
注意将mklink
命令作为单个参数发送到cmd
…
cmd /c "mklink link target"
这是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.
如果你想通过GUI创build链接,我build议使用链接shell扩展 ,这是一个Windows资源pipe理器插件,用于创build符号链接,硬链接,连接和卷挂载点。 我一直在使用它多年!
如果您的系统上有一个较小的SSD驱动器,则符号链接可以成为一种挽救生命的方式。C:驱动器需要将一些不需要在SSD上的臃肿文件夹符号链接到其他驱动器上。 我使用免费的WinDirStat查找磁盘空间猪。
对于我的设置,这是在Windows 8.1上安装的Windows 2.11.0的Git export MSYS=winsymlinks:nativestrict
做的伎俩在这里解释: https : //github.com/git-for-windows/git/pull/156这是重要的在Windows上以pipe理员身份启动Git Bash shell,只有pipe理员可以创build符号链接。 所以,为了使tar -xf
工作并创build所需的符号链接:
- 以pipe理员身份运行Git Bash shell
- 运行
export MSYS=winsymlinks:nativestrict
- 运行焦油
由于这是search在Msys或git bash中创build符号链接时出现的顶级链接之一,我发现答案是添加set MSYS=winsymlinks:native
在调用git-cmd.exe
(我运行ConEmu)或取消注释msys2_shell.bat
同一行