如果我有一个符号链接文件或目录,并将其提交到Git存储库,那会发生什么?
我认为它将保留为符号链接,直到文件被删除为止,然后,如果您从旧版本中拉回文件,它只会创建一个普通文件。
删除文件引用时该怎么办?它只是提交悬空的链接吗?
../..
根据需要使用。
git pull
创建文件而不是符号链接,请尝试以管理员身份运行Git客户端。
如果我有一个符号链接文件或目录,并将其提交到Git存储库,那会发生什么?
我认为它将保留为符号链接,直到文件被删除为止,然后,如果您从旧版本中拉回文件,它只会创建一个普通文件。
删除文件引用时该怎么办?它只是提交悬空的链接吗?
../..
根据需要使用。
git pull
创建文件而不是符号链接,请尝试以管理员身份运行Git客户端。
Answers:
就像普通文件一样,Git只是将链接的内容(即链接到的文件系统对象的路径)存储在“斑点”中。然后,它将名称,模式和类型(包括符号链接这一事实)存储在表示其包含目录的树对象中。
签出包含链接的树时,无论目标文件系统对象是否存在,它都会将对象恢复为符号链接。
如果删除符号链接引用的文件,则不会以任何方式影响Git控制的符号链接。您将有一个悬而未决的参考。如果需要,用户可以删除或更改链接以指向有效内容。
core.symlinks
配置变量设置为false,符号链接将作为包含链接文本的小型纯文本文件检出。
symlinks = false
搞砸它们。
您可以通过将文件添加到索引中来查看Git对文件的处理方式。索引就像一个预先提交。提交索引后,您可以git checkout
用来将索引中的所有内容都带回到工作目录中。那么,当您向索引添加符号链接时,Git会做什么?
为了找出答案,首先建立一个符号链接:
$ ln -s /path/referenced/by/symlink symlink
Git尚不知道此文件。git ls-files
使您可以检查索引(-s
类似打印stat
的输出):
$ git ls-files -s ./symlink
[nothing]
现在,通过将符号链接的内容添加到索引中,将其添加到Git对象存储中。将文件添加到索引时,Git会将其内容存储在Git对象存储中。
$ git add ./symlink
那么,增加了什么呢?
$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink
哈希是对在Git对象存储中创建的打包对象的引用。如果您在.git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
存储库的根目录中查找,则可以检查该对象。这是Git存储在资源库中的文件,您以后可以检出。如果检查此文件,您会发现它很小。它不存储链接文件的内容。
(请注意120000
,ls-files
输出中列出了该模式。这类似于100644
常规文件。)
但是,当您从存储库中检出该对象并进入文件系统时,Git对该对象有什么作用?这取决于core.symlinks
配置。来自man git-config
:
核心符号链接
如果为false,则将符号链接检出为包含链接文本的小型纯文件。
因此,在存储库中使用符号链接时,在结帐时,您将获得一个参考完整文件系统路径的文本文件,或者是一个正确的符号链接,具体取决于core.symlinks
配置的值。
无论哪种方式,符号链接引用的数据都不会存储在资源库中。
“编者注”:该帖子可能包含过时的信息。请参阅注释和有关自1.6.1起的Git更改的问题。
链接目录:
重要的是要注意当目录为软链接时会发生什么。任何带有更新的Git拉动都将删除该链接并将其设置为普通目录。这是我努力学习的方法。这里和这里有一些见解。
例
之前
ls -l
lrwxrwxrwx 1 admin adm 29 Sep 30 15:28 src/somedir -> /mnt/somedir
git add/commit/push
It remains the same
在git pull
AND 之后发现一些更新
drwxrwsr-x 2 admin adm 4096 Oct 2 05:54 src/somedir
.gitignore
将符号链接视为文件而不是文件夹。