关于在Windows上添加对符号链接的支持,有很多问题。但是,当我在Windows上克隆a repository with symlinks时会发生什么?
答案 0 :(得分:48)
由于本机Git客户端git clone
和git init
的{{3}}将探测目标文件系统以获得符号链接支持,并相应地设置core.symlinks
的本地存储库配置,即FAT或NTFS的false
。 这使得创建和提交符号链接,例如在Linux下显示为包含Windows 下的链接文本的纯文本文件(有关详细信息,请参阅version 1.5.3)。
由于git config documentation on core.symlinks安装程序有Git for Windows version 2.10.2。
在旧版本的Git for Windows中,您可以手动将core.symlinks
设置为true
,这使得Git能够在以下限制条件下创建符号链接:
SeCreateSymbolicLinkPrivilege
权限。Git for Windows wiki中提供了更多an explicit option to enable symbolic link support。
在旧版本的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配置。从details JGit探针开始支持符号链接,但似乎过于保守,设置core.symlinks = false
version 3.3。
您可以签出in some cases where symlinks would be in fact supported,其中包含在Linux上创建的一系列链接以进行测试。
答案 1 :(得分:11)
一个解决方案有一个过滤器,用于检测Git存储的符号链接,并用Windows符号链接替换它们。
详情请参阅“Git Symlinks in Windows”
然而,真正的符号链接支持不仅仅是现在:
请参阅issue 224和最近的(2012年7月)discussion on GitHub(您查看过):
Windows上有三种类型的文件系统链接:硬链接,联结和符号链接。
- 自NT以来,可以使用硬链接和连接。硬链接只能指向文件,只能指向目录(在同一卷上)。
- 自Vista以来可用的符号链接可以指向文件或目录,也可以指向不同的卷。
自Vista之后发布的mklink
可以创建以上所有内容。但是在脚本中调用它的方式使得它只创建符号链接(这很好,恕我直言,因为它们最像Linux符号链接)。对于Vista之前的版本,我们需要使用“
fsutil hardlink
”为文件创建硬链接的后备(但可能仅在没有“-s
”的情况下调用“ln”)并创建联结对于使用“fsutils reparsepoint
”的目录,或只是调用原始ln.exe
。除了打破Windows XP设置之外,这样的更改还会破坏标准的Windows 7设置,因为
mklink
默认需要管理员权限。这可以通过检查它是否有效来修复,并在这种情况下恢复复制。仅供记录:我最近尝试在Git for Windows中使用symlink支持玩了一下,但最终得出的结论是,Windows 7及更高版本中的“符号链接支持”对于模拟Unix符号链接几乎没用
有一个项目声称“Open Source, 100% Compatible ln for Windows (and Junction Point library)”,但是:
不幸的是,普通用户在Windows上默认没有创建符号链接所需的权限。将此与您无法以与POSIX要求相同的方式更改符号链接所指向的事实相结合,使它们对我们来说或多或少都无用。我已在上面写过。
现在,作者可以声称所有他们想要的是“我100%兼容”,但是快速查看源代码就会发现它不是。它们不提供任何后备,甚至不会动态加载
CreateSymbolicLink
函数。因此,非符号链接的Windows版本的结果将是一个丢失符号错误的崩溃。
答案 2 :(得分:9)
我一直在使用msysgit中的Symlink支持:
https://github.com/frogonwheels/git(branch mrg / symlink-v * ..目前为v2)
测试确实不运行完成,而且我只有有限的时间来处理它,并没有真正的短期目标来激励我。能够在msysgit下使用像git-annex这样的项目真是太好了。
我的工作也因msys shell中缺少符号链接支持而受到阻碍。
有一个命令行用于授予cygwin ln命令建议的权限。 (您需要以管理员身份运行它。)
editrights -a SeCreateSymbolicLinkPrivilege -a $ YOUR_USER
目录与文件符号链接的整个问题是一个很大的问题。
目前我认为我们尽可能地限制自己使文件符号链接工作......并且不允许在msysgit中使用目录符号链接。它并不理想,但实际情况是,任何解决方案都是一个小问题,试图通过possix链接将可能链接到NTFS不兼容的现实只是痛苦。
我们可以尝试检测目标是文件还是目录,但我可以想到一些问题,尤其是实体创建顺序的整个问题。