git如何处理符号链接?

如果我有一个文件或目录是一个符号链接,我将它提交给一个git repo会发生什么?

我假设它将它作为符号链接保留,直到文件被删除,然后如果从旧版本中取回文件,它只会创建一个普通文件。

当我删除它引用的文件时它做了什么? 它只是提交悬挂链接吗?


git只是将链接的内容(即它链接到的文件系统对象的路径)存储在“blob”中,就像正常文件一样。 然后它将名称,模式和类型(包括它是符号链接的事实)存储在表示其包含的目录的树对象中。

当您检出包含该链接的树时,它会将该对象恢复为符号链接,而不管目标文件系统对象是否存在。

如果删除符号链接引用的文件,则不会以任何方式影响git控制的符号链接。 你会有一个悬而未决的参考。 用户可以根据需要删除或更改链接以指向某些有效的内容。


TL; DR:由符号链接引用的数据未存储在存储库中。


您可以通过查看Git在将文件添加到索引时执行的操作来了解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拉链删除链接,并使其成为一个正常的目录。 这是我学到了很多东西。 这里和这里有一些见解。

之前

 ls -l
 lrwxrwxrwx 1 admin adm   29 Sep 30 15:28 src/somedir -> /mnt/somedir

git添加/提交/推送

It remains the same

在git pull并找到一些更新之后

 drwxrwsr-x 2 admin adm 4096 Oct  2 05:54 src/somedir
链接地址: http://www.djcxy.com/p/13683.html

上一篇: How does git handle symbolic links?

下一篇: Remove a symlink to a directory