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 } 

还要注意几件事情:

  1. 我刚刚写了这个,并在Win7和Ubuntu上进行了简短的testing,如果你是从2015年开始使用Windows 9的话,请先试一试。
  2. NTFS具有重parsing点和交接点。 我select重新parsing点是因为它更像是一个实际的符号链接,适用于文件或目录,但是交叉点在XP中有一个可用的解决scheme,除了它只是用于目录。
  3. 一些文件系统,尤其是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所需的符号链接:

  1. 以pipe理员身份运行Git Bash shell
  2. 运行export MSYS=winsymlinks:nativestrict
  3. 运行焦油

由于这是search在Msys或git bash中创build符号链接时出现的顶级链接之一,我发现答案是添加set MSYS=winsymlinks:native在调用git-cmd.exe (我运行ConEmu)或取消注释msys2_shell.bat同一行