由于我的文本编辑器导致硬链接丢失时该怎么办

由于我的文本编辑器导致硬链接丢失时该怎么办

所以,我有一个文件,在本例中我们将其命名为$HOME/Documents/hello.txt.我会在里面写一些文字:

Hello, welcome to my text file

我将在这里硬链接这个文件:$HOME/Documents/Backup/hello.txt

好吧,太好了,现在这是硬链接的。如果我写入原始文件,硬链接将被更新:

echo "Hello again" >> $HOME/Documents/hello.txt
cat $HOME/Documents/hello.txt
Hello, welcome to my text file
Hello again
cat $HOME/Documents/Backup/hello.txt
Hello, welcome to my text file
Hello again

现在,我的问题是,每当我使用许多创建临时文件的程序打开任一文件(任一硬链接副本)时,它都会丢失其链接关系,并且两个文件都不会再更新另一个文件。

那么,在这种情况下我能做什么呢?

注意:在这种情况下我不能使用符号链接,因为我使用 Github 的硬链接来备份一些文件,而 Git 不遵循符号链接。

答案1

正如 mosvy 所说这条评论,大多数编辑者都会在原始文件的副本中进行编辑,然后将其替换(删除)。虽然这提高了安全性,但它破坏了硬链接。

但是,某些编辑器(例如 GNU Emacs)可以配置为执行文件编辑到位,这意味着它们直接更改原始文件,就像您在 shell 中所做的那样。例如这个问题相应的答案正好讨论了您关于 Gnu Emacs 的问题。因此,您的编辑器的配置将是首先要考虑的点。

由于您只需要 Git 的硬链接(?),不幸的是您对工作流程不是很详细,因此您很可能可以在提交您随后想要推送到 GitHub 的内容之前立即使用 Git 挂钩重新建立正确的硬链接: 这pre-commit钩子似乎是一个有前途的候选者。请参阅手册页吉特钩子(5)了解详情。

答案2

正如已经解释过的于尔根莫斯维,硬链接的问题在于,大多数编辑器在原始文件的副本中进行编辑,稍后将其替换(删除),以两个不同的副本结束,而不是传播更改。

为了防止这种情况,一个简单的解决方案是将一组硬链接放在同一目录中,作为不同路径中链接的文件的“索引”,然后防止将新的 inode 写入该目录。

这可以通过将权限设置为只读来完成:

chmod a-w .

或通过设置锁定属性(仅适用于 HFS+/APFS 文件系统):

SetFile -a L .

这样,您/编辑器就无法将任何其他文件写入此“索引目录”,但如果编辑器允许,您仍然可以修改现有的硬链接(例如,通过使用允许正确编辑硬链接的 VIM)。要添加另一个硬链接,只需使用相反的命令(chmod u+w .或)重置写入模式即可SetFile -a l .

相关内容