在Windows上使用符号链接克隆存储库时会发生什么?

时间:2012-07-26 05:24:17

标签: windows git symlink msysgit

关于在Windows上添加对符号链接的支持,有很多问题。但是,当我在Windows上克隆a repository with symlinks时会发生什么?

3 个答案:

答案 0 :(得分:48)

由于本机Git客户端git clonegit 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能够在以下限制条件下创建符号链接:

  • 符号链接仅适用于Windows Vista及更高版本。
  • 符号链接仅适用于NTFS,而不适用于FAT。
  • 您需要成为管理员和/或拥有SeCreateSymbolicLinkPrivilege权限。
  • 默认情况下禁用远程文件系统上的符号链接。
  • 键入Windows的符号链接。
  • 许多程序不了解符号链接(包括旧版本的Windows资源管理器)。

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不兼容的现实只是痛苦。

我们可以尝试检测目标是文件还是目录,但我可以想到一些问题,尤其是实体创建顺序的整个问题。