![git 硬链接 - 它知道文件是硬链接吗?](https://linux22.com/image/1273371/git%20%E7%A1%AC%E9%93%BE%E6%8E%A5%20-%20%E5%AE%83%E7%9F%A5%E9%81%93%E6%96%87%E4%BB%B6%E6%98%AF%E7%A1%AC%E9%93%BE%E6%8E%A5%E5%90%97%EF%BC%9F.png)
我开始使用硬链接而不是符号链接来组织文件......
我一直对我拍摄的照片进行这样的操作,对它们进行分类,并指出哪些是我想要打印的,等等。
我正在使用 git 备份我的图像,但似乎 git 认为它们是新文件,因为存储库的大小增长了约 1GB。如果我不使用 git 重命名文件,Git 在检测重命名方面确实做得很好,但它也能处理硬链接吗?
沃尔特
答案1
多个链接的跟踪文件不会导致 Git 的对象存储过大,因为每个链接都由完全相同的 blob 对象表示。但是,由于链接断开,您的工作树最终可能会增长。
Git 不会跟踪所跟踪的工作树文件是否是指向同一个文件的硬链接。
如果您不要求 Git 执行任何涉及修改这些路径名的内容或删除路径名的目录条目的操作,Git 将保留多重链接、跟踪、工作树文件。但是,如果您(例如)签出旧提交或分支,然后切换回正常的最新分支/提交,那么 Git 最终将“破坏”硬链接(用新的(但相同的)文件替换受影响的路径名,而不是重新创建多重链接的情况)。
要恢复多重链接状态,您可以编写一个程序来扫描相同的文件并将它们重新链接到任何一个文件。如果所有链接都不在工作树本身中,或者至少不在某些容易识别的“外部”位置,则这种“重新链接”操作可能会更复杂(即,如果您将整个主目录中的“随机”文件链接到“备份”存储库并使用 Git 修改工作树,则可能很难恢复链接)。
Git 邮件列表中提出了这个想法:
- 希望 Git 断开链接,以便克隆的存储库
cp -a
是独立的 - 建议的
core.keepHardLinks
(从未集成到任何发布的 Git 中?) - 与此类似的问题
- 可能还有其他人……