类似的问题在这里被问到,但它缺乏对为什么会发生的调查,答案太笼统了: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指向任何地方时创建目录符号链接,也许会更好?老问题建议设置克隆钩子,但对于公共开源仓库来说,这看起来不太好,因为它应该很容易克隆和构建。
1条答案
按热度按时间ocebsuys1#
Git for Windows在
.gitattributes
中有一个特殊的扩展名,可以让你指定符号链接是文件还是目录。例如:字符串
请注意,这在其他操作系统上被忽略,因为它们没有这个问题。