鉴于我在回购中有两个普通文件夹:
<meta http-equiv="refresh" content="3">
我将drwx------ dir_a/
drwx------ dir_b/
转换为指向dir_b
的相对符号链接(即dir_a
和rm -rf dir_b
,以便现在看起来像:
ln -s dir_a dir_b
提交,推送和拉动另一台机器后,我看到drwx------ dir_a/
lrwxrwxrwx dir_b -> dir_a/
显示为普通文件,而不是文件夹符号链接
dir_b
尝试删除$ ls -al
drwx------ dir_a/
-rw------- dir_b
并使用dir_b
进行恢复,但仍将其重新创建为文件,而不是文件夹符号链接。文件系统是ext4,支持符号链接。实际上,在同一个分区上执行新的git checkout dir_b
会将git clone
创建为符号链接。
如果问题重要,我会提到dir_b
的实际名称以点开头(例如dir_b
)。
.dir_b
工作正常,因此我可以将其用作解决方法,但想知道究竟发生了什么以及恢复符号链接文件夹的正确方法是什么,因为显然git clone
不像在原始仓库中那样重新创建文件夹。
答案 0 :(得分:3)
这种情况下的修复是运行:
git config core.symlinks true
(检查其他非默认设置可能是明智的,特别是如果SD卡存储库是由其他操作系统创建的。)
正如评论中所讨论的,这里的关键元素是存储库最初是在非符号链接的文件系统上创建的,然后移动(手动复制)到支持符号链接的文件系统。 The git config
documentation,在描述core.symlinks
的部分中说:
如果为false,则将符号链接签出为包含链接文本的小型普通文件。 git-update-index(1)和git-add(1)不会将记录的类型更改为常规文件。在FAT等不支持符号链接的文件系统上很有用。
默认值为true,但git-clone(1)或git-init(1)将探测并在创建存储库时将core.symlinks设置为false。
通常,在逻辑或物理驱动器上移动它时,git clone
存储库会更安全一些,因为新克隆将探测新文件系统的设置。 Git非常擅长自动检测其他更改(例如,索引编码工作树路径),并且大多数这些设置是特定于操作系统的,而不是特定于文件系统的。但是,如果您交叉引导不同的操作系统(或在虚拟机管理程序下运行它们)并在此之间共享某些媒体,则这些额外的core.*
设置可能会导致问题。例如,请参阅core.fileMode
和core.protectNTFS
。