问题
最近在Windows的MSYS2环境下执行rsync同步远程目录到本地,结果发现屡次失败。但通过查看发现都和软链接的创建有关。
分析
经过一番解决的过程后,最终确认了两个问题
- 默认情况下msys2会把ln -s变成复制动作
- 如果启用原生软链接,ln -s不能创建对不存在文件的链接
解决
解决方案很简单,就是修改msys2_shell.cmd
这个文件,替换这一行
1 2 |
rem set MSYS=winsymlinks:nativestrict |
变成
1 2 |
set MSYS=winsyslinks:lnk |
这样一来上面两个问题就都解决了。
后记
为什么msys2默认不使用MSYS=winsyslinks:lnk
呢,也就是这样做有什么风险呢?
这里发现,使用windows默认的资源管理器和其他应用程序,是不能正常读取使用快捷方式作为软链接的目录的。而winsyslinks:nativestrict
模式和winsyslinks:native
下,可以正常读取软链接的目录和文件,但是不能链接不存在的文件,所以行为上又不一致。
所以msys2权衡利弊之后,默认还是采用兼容性最好的不使用软链接,直接拷贝的形式来方便windows的应用程序使用。