如果我有一个符号链接的文件或目录,我将它提交给git repo会发生什么?
我会假设它将它作为符号链接留下,直到文件被删除,然后如果你从旧版本拉回文件它只是创建一个普通文件。
当我删除它引用的文件时它会怎么做?它只是提交悬空链接吗?
如果我有一个符号链接的文件或目录,我将它提交给git repo会发生什么?
我会假设它将它作为符号链接留下,直到文件被删除,然后如果你从旧版本拉回文件它只是创建一个普通文件。
当我删除它引用的文件时它会怎么做?它只是提交悬空链接吗?
git只是将一个链接的内容(即它链接到的文件系统对象的路径)存储在'blob'中,就像它对普通文件一样。然后,它在表示其包含目录的树对象中存储名称,模式和类型(包括它是符号链接的事实)。
签出包含链接的树时,无论目标文件系统对象是否存在,它都会将对象还原为符号链接。
如果删除符号链接引用的文件,则不会以任何方式影响git控制的符号链接。你将有一个悬空参考。用户可以根据需要删除或更改链接以指向有效的内容。
TL; DR:符号链接引用的数据不存储在存储库中。
您可以通过查看将文件添加到索引时的功能来了解Git对文件执行的操作。索引就像预先提交一样。随着索引的提交,您可以使用 git checkout
将索引中的所有内容返回到工作目录中。那么,当您向索引添加符号链接时,Git会做什么?
要找出答案,首先要做一个符号链接:
$ ln -s /Path/referenced/by/symlink symlink
Git还不知道这个文件。 git ls-files
让你检查索引(-s
版画 stat
式输出):
$ git ls-files -s ./symlink
$
现在,通过将符号链接的内容添加到索引,将其添加到Git对象库中。将文件添加到索引时,Git将其内容存储在Git对象库中。
$ git add ./symlink
那么,添加了什么?
$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink
$
哈希是对在Git对象库中创建的压缩对象的引用。如果查看,可以检查此对象 .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
。
该 120000
是文件模式。它会是这样的 100644
对于常规文件,是链接的特殊模式。从 man git-config
:
core.symlinks
如果为false,则将符号链接签出为包含链接文本的小型纯文本。 git-update-index(1)和git-add(1)不会将记录的类型更改为常规文件。
使用 git cat-file -p
漂亮地打印内容:
$ git cat-file -p 1596f9db1
/Path/referenced/by/symlink
所以,这就是Git对符号链接所做的事情:当你 git checkout
在符号链接中,您要么获得一个文本文件,其中包含对完整文件系统路径的引用,要么根据配置获得符号链接。 符号链接引用的数据不存储在存储库中。
符号链接目录:
重要的是要注意当存在软链接的目录时会发生什么。 任何带有更新的git pull都会删除该链接并使其成为普通目录。这就是我学到的难点。一些见解 这里 和 这里。
例
之前
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之后发现了一些更新
drwxrwsr-x 2 admin adm 4096 Oct 2 05:54 src/somedir