当符号链接指向Windows上的子模块时,Git克隆问题

rqdpfwrv  于 11个月前  发布在  Git
关注(0)|答案(1)|浏览(130)

类似的问题在这里被问到,但它缺乏对为什么会发生的调查,答案太笼统了:How to properly git clone with Windows symlinks pointing to folder in submodule
示例存储库:https://github.com/Zergatul/symlink-test

  • 我在java-scripting-language目录的根目录下有子模块
  • 我有指向子模块目录scripting -> java-scripting-language\src\main\com\zergatul\scripting的符号链接

当我在启用了符号链接的情况下运行git clone --recurse-submodules https://github.com/Zergatul/symlink-test.git(core.symlinks=true)时,会发生以下情况:

  • Git首先克隆主仓库
  • Git看到了符号链接。现在它取决于文件系统。Git有两种类型的符号链接:对于文件和目录。类Unix的文件系统,如ext4或HFS+只有单一类型的符号链接,因此Git只为它们创建普通的符号链接。在Windows上,Git检查符号链接指向的路径。如果路径指向文件,Git创建文件符号链接,如果path是directory -它会创建目录符号链接。如果目标路径没有指向任何地方,Git会默认创建文件符号链接。因为子模块还没有在这里,Git会创建文件符号链接。
  • Git clones子模块
  • 现在文件符号链接指向目录,使其在Windows中无效符号链接

要修复这个问题,我可以在添加符号链接之前 checkout 仓库,然后签回HEAD:

git checkout 92b072cb536f4628eba0f9b70143e2010163ac58
git switch master

字符串
以上2个命令修复符号链接。
但是这能做得更干净吗?如果我们可以覆盖默认的Git行为,并告诉它在path指向任何地方时创建目录符号链接,也许会更好?老问题建议设置克隆钩子,但对于公共开源仓库来说,这看起来不太好,因为它应该很容易克隆和构建。

ocebsuys

ocebsuys1#

Git for Windows在.gitattributes中有一个特殊的扩展名,可以让你指定符号链接是文件还是目录。例如:

*.gif symlink=file
tools_folder symlink=dir

字符串
请注意,这在其他操作系统上被忽略,因为它们没有这个问题。

相关问题