解决Windows MSYS2环境下ln -s失败问题

问题

最近在Windows的MSYS2环境下执行rsync同步远程目录到本地,结果发现屡次失败。但通过查看发现都和软链接的创建有关。

分析

经过一番解决的过程后,最终确认了两个问题

  • 默认情况下msys2会把ln -s变成复制动作
  • 如果启用原生软链接,ln -s不能创建对不存在文件的链接

解决

解决方案很简单,就是修改msys2_shell.cmd这个文件,替换这一行

变成

这样一来上面两个问题就都解决了。

后记

为什么msys2默认不使用MSYS=winsyslinks:lnk呢,也就是这样做有什么风险呢?
这里发现,使用windows默认的资源管理器和其他应用程序,是不能正常读取使用快捷方式作为软链接的目录的。而winsyslinks:nativestrict模式和winsyslinks:native下,可以正常读取软链接的目录和文件,但是不能链接不存在的文件,所以行为上又不一致。

所以msys2权衡利弊之后,默认还是采用兼容性最好的不使用软链接,直接拷贝的形式来方便windows的应用程序使用。