我能否通过将符号链接放入Git存储库来添加文件?

5
有没有一种方法可以通过符号链接将文件推送到git存储库之外?
例如,我想推送文件/root/my_file,并在git存储库中创建了一个符号链接my_symbolic_link。
# ls -lA                                                                                                                    
drwxr-xr-x 7 root root 4096 Oct  8 07:55 .git/
lrwxrwxrwx 1 root root   26 Oct  8 7:58 my_symbolic_link -> /root/my_file

1
我认为这只会添加链接本身... - beatngu13
默认情况下是可以的,我可以配置git来改变这种行为。 - user123456
我认为不行,即使使用硬链接(参见这里)。 - beatngu13
我已经检查过了,将硬链接提交到git仓库的操作正常工作。我在Ubuntu 14.04上使用git版本2.10.1进行了测试;在测试期间,本地仓库位于ext4分区,远程仓库位于BitBucket上。 - TeWu
@TeWu “按预期工作”可能太仓促了。你尝试过在其他地方更新文件并进行pull吗?放弃本地更改,从你的repo中进行checkout呢?我不是说你错了,但是像这样的帖子让我产生了怀疑。 - beatngu13
@beatngu13的“按预期工作”这个说法并不是非常精确;为了避免误解,我更新了我的回答。 - TeWu
2个回答

13

符号链接是一个包含对文件系统中另一个文件的引用的文件。您可以将符号链接添加到存储库中,但这样做仅会添加对其他文件的引用而不是其他文件本身。

如果希望向存储库添加实际文件,请使用硬链接而不是符号链接。硬链接是文件名和其内容(及元数据)在文件系统级别上的关联。通过创建硬链接到文件并将其添加到您的存储库中,您正在添加该链接文件。在符合POSIX标准的操作系统(如所有的Linux系统)上,您可以这样创建硬链接:

ln /root/my_file my_hard_link

了解不同类型链接的更多信息,请参见这个问题及其答案。

更新:请注意,git对硬链接一无所知。将硬链接添加到git repo中意味着您正在添加该链接文件的内容。Git不知道您刚添加的文件是硬链接。向repo添加硬链接不会破坏它,但从repo中检出它将创建该文件的新副本,并且不会重新创建该硬链接。 "检出"不仅是指git checkout命令,还包括操作如clone复制repo的新副本,删除硬链接并使用git reset重新创建它,或者从远程repo pull新版本的此硬链接文件。

总之-您有两个选项:

  • 将符号链接添加到repo-这将仅添加关于链接的信息,而不是链接文件的内容。
  • 将硬链接添加到repo-这将添加链接文件的内容。虽然它不会添加关于链接的信息,但在下一次从repo检查该硬链接文件之前,它也不会破坏该链接。

0

如果您使用的是Windows系统,您可以尝试使用Git for Windows在git仓库中创建符号链接的方法。

从Windows Vista开始,支持符号链接。您需要在应用程序安装过程中启用Git上的符号链接(参见图片)。

默认情况下,在Git Bash中使用ln -s命令不会创建符号链接,而是创建副本。

要创建符号链接(前提是您的帐户有权限这样做),请使用内置的mklink命令,如下所示:

mklink /d this-link-points-to c:\that-directory
mklink this-link-points-to c:\that-file

Enable Symbolik Link on Git


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接