Git将目录符号链接创建为文件

Git将目录符号链接创建为文件,git,symlink,Git,Symlink,在回购协议中给定两个普通文件夹: drwx------dir\u a/ drwx------目录b/ 我将dir\u b转换为指向dir\u a(即rm-rf dir\u b和ln-s dir\u a dir\u b的相对符号链接,因此现在它看起来像: drwx------dir\u a/ lrwxrwxrwx直飞方向b->直飞方向a/ 提交、推拉另一台机器后,我看到dir_b显示为普通文件,而不是文件夹符号链接 $ls-al drwx------目录a/ -rw------直读 尝试删除

在回购协议中给定两个普通文件夹:

drwx------dir\u a/
drwx------目录b/
我将
dir\u b
转换为指向
dir\u a
(即
rm-rf dir\u b
ln-s dir\u a dir\u b
的相对符号链接,因此现在它看起来像:

drwx------dir\u a/
lrwxrwxrwx直飞方向b->直飞方向a/
提交、推拉另一台机器后,我看到
dir_b
显示为普通文件,而不是文件夹符号链接

$ls-al
drwx------目录a/
-rw------直读
尝试删除
dir_b
并使用
git checkout dir_b
还原它,但它仍然被重新创建为文件,而不是文件夹符号链接。文件系统是支持符号链接的ext4。事实上,在同一分区上执行新的
git克隆
确实会按预期创建
dir_b
作为符号链接

如果有关系,我会提到
dir\u b
的实际名称以点开头(例如
.dir\u b


git clone
工作正常,因此我可以将其用作解决方案,但我想知道到底发生了什么,以及恢复符号链接文件夹的正确方法是什么,因为显然
git checkout symlinked_folder
没有像原始repo中那样重新创建文件夹。

本例中的修复程序是运行:

git config core.symlinks true
(最好检查其他非默认设置,尤其是SD卡存储库是由其他操作系统创建的。)

正如评论中所讨论的,这里的关键要素是存储库最初是在非symlink支持文件系统上创建的,然后移动(手动复制)到symlink支持文件系统。下面描述
核心的部分中指出:

如果为false,则符号链接将作为包含链接文本的小型普通文件签出。并且不会将录制的类型更改为常规文件。在不支持符号链接的FAT等文件系统上非常有用

默认值为true,除非或将在创建存储库时探测并将core.symlinks设置为false(如果适用)


一般来说,在逻辑或物理驱动器上移动存储库时,使用git clone
稍微安全一点,因为新的克隆将探测新文件系统的设置。git非常擅长自动检测其他更改(例如,索引对工作树路径进行编码)而且大多数设置都是特定于操作系统的,而不是特定于文件系统的不过,这些额外的
core.*
设置可能会导致问题。请参阅,例如
core.fileMode
core.protectNTFS

如果
git clone
工作正常,并且您没有在存储库中禁用出现故障的符号链接,这似乎是一个直接的错误。如果您有禁用的符号链接(通过将
core.symlinks
设置为
false
),只需重新启用它们即可。@torek:
git config-l | grep symlinks
返回
core.symlinks=false
,这就是问题所在。将其配置回
true
,所有操作都应再次正常。请注意
git config
文档声明(quote)“默认值为true,但git clone(1)或git init(1)将在创建存储库时探测并设置
core.symlinks
false(如果适用)。”git配置--global core.symlinks是否为true并在不使用
--global
的情况下重复,以及
git checkout dir_b
是否有效。现在我意识到发生了什么:我最初克隆到手机的SD卡,该SD卡很胖,因此符号链接设置为false,然后我将repo移动到内部EXT4分区。请添加您的评论作为回答,我可以接受。顺便说一句,您根本不应该将其设置为
--global
,因为它是针对每个存储库的(如
core.bare
core.repositoryformatversion
)。感谢您提供有关
filemode
的提示!我确实注意到从另一个克隆中提取时未设置可执行文件标志的不一致,现在我知道了原因。顺便说一句,在我的
.git/config
中,它被列为
core.filemode
(全部小写),但我假设配置选项可能不区分大小写。是的,在比较之前,它们都简化为小写。(尽管德语最近需要大写字母,但这种简化方向在某些语言中是至关重要的。请参阅。同时,尽管Git的所有内置配置变量都是ASCII编码的,所以大写字母实际上就足够了……)