关于在 Windows 上添加对符号链接的支持存在很多问题。但是,当我在 Windows 上克隆带有符号链接的存储库时,实际上会发生什么?
3 回答
从本机 Git 客户端版本 1.5.3git clone
开始,git init
将探测目标文件系统的符号链接支持,并相应地设置本地存储库配置core.symlinks
,即false
FAT 或 NTFS。这使得在 Linux 下创建和提交的符号链接显示为纯文本文件,其中包含 Windows 下的链接文本(有关详细信息,请参阅core.symlinks 上的 git config 文档)。
从Git for Windows 版本 2.10.2开始,安装程序有一个明确的选项来启用符号链接支持。
在旧版本的 Git for Windows 中,您可以手动设置core.symlinks
启用true
的 Git 在以下约束下创建符号链接:
- 符号链接仅适用于 Windows Vista 及更高版本。
- 符号链接仅适用于 NTFS,不适用于 FAT。
- 您需要成为管理员和/或拥有
SeCreateSymbolicLinkPrivilege
权限。 - 默认情况下禁用远程文件系统上的符号链接。
- 键入 Windows 的符号链接。
- 许多程序不理解符号链接(包括旧版本的 Windows 资源管理器)。
Git for Windows wiki 中提供了更多详细信息。
在旧版本的 Git for Windows 中手动设置core.symlinks
为true
在克隆和重置工作树之后,您会收到类似于以下内容的错误消息
$ git reset --hard HEAD
error: unable to create symlink directory (Function not implemented)
error: unable to create symlink linux-links/this_is_a_symbolic_link_to_file (Function not implemented)
fatal: Could not reset index file to revision 'HEAD'.
附带说明一下,JGit 客户端直到 3.3 版才探测目标文件系统的符号链接支持,因此core.symlinks
设置回退到系统/全局 Git 配置。从3.3 版开始, JGit 探测符号链接支持,但似乎过于保守,core.symlinks = false
在某些情况下设置实际上支持符号链接。
您可以查看https://github.com/sschuberth/git-playground,其中包含在 Linux 上创建的用于测试的一堆链接。
一种解决方案是使用过滤器来检测 Git 存储的符号链接并将其替换为 Windows 符号链接。
这在“ Windows 中的 Git 符号链接”中有详细说明
然而,真正的符号链接支持不仅限于现在:
请参阅第 224 期和 GitHub 上最近(2012 年 7 月)的讨论(您查看过):
以下是 Windows 上的三种文件系统链接:硬链接、联结和符号链接。
- 自 NT 以来,硬链接和结点可用。硬链接只能指向文件,连接只能指向目录(在同一卷上)。
- 自 Vista 以来可用的符号链接可以指向文件或目录,也可以指向不同的卷。
mklink
,自 Vista 以来发布,可以创建上述所有内容。但是在脚本中调用它的方式使它只创建符号链接(这很好,恕我直言,因为它们最接近 Linux 符号链接)。对于Vista 之前的版本,我们需要一个后备,使用“
fsutil hardlink
”为文件创建硬链接(但可能只有在没有“”的情况下调用“ln”-s
)并使用“”为目录创建连接fsutils reparsepoint
,或者简单地调用原始的ln.exe
.除了破坏 Windows XP 设置之外,这样的更改也会破坏标准 Windows 7 设置,因为
mklink
默认情况下需要管理员权限。这可以通过检查它是否有效,并在这种情况下恢复复制来解决。仅作记录:我最近尝试在 Git for Windows 本身中支持符号链接,但最终得出结论,Windows 7 及更高版本中的“符号链接支持”对于模拟 Unix 符号链接几乎没有用处。
有一个项目声称“ Open Source, 100% Compatible ln for Windows (and Junction Point library) ”,但是:
不幸的是,普通用户默认没有在 Windows 上创建符号链接所需的权限。将这一点与您无法以 POSIX 要求的相同方式更改符号链接指向的事实相结合,使它们或多或少对我们无用。这个我上面已经写过了。
现在,作者可以声称这是“100% 兼容”的,我所关心的,但快速查看源代码会发现它不是。它们不提供任何回退,甚至不
CreateSymbolicLink
动态加载函数。因此,非符号链接功能的 Windows 版本的结果将是一个缺少符号错误的崩溃。
我一直在 msysgit 中处理 Symlink 支持:
https://github.com/frogonwheels/git (分支 mrg/symlink-v* .. 当前为 v2)
测试还没有完成,我的工作时间有限,也没有真正的短期目标来激励我。如果能在 msysgit 下使用 git-annex 之类的项目就好了。
我的工作也因 msys shell 中缺乏符号链接支持而受到阻碍。
有一个命令行用于授予 cygwin ln 命令建议的权限。(您需要以管理员身份运行它)。
编辑权限 -a SeCreateSymbolicLinkPrivilege -a $YOUR_USER
目录与文件符号链接的整个问题是一个大问题。
目前我认为,我们尽可能地限制自己使文件符号链接工作......并且不允许在 msysgit 中使用目录符号链接。这并不理想,但现实情况是任何解决方案都有点杂乱无章,试图将 possix 链接强加到 NTFS 与 possix 链接不兼容的现实上是痛苦的。
我们可以尝试检测目标是文件还是目录,但我可以想到一些问题,尤其是实体创建顺序的整个问题。