如何让 Mercurial 检测对符号链接目标所做的更改

How to make Mercurial detect changes made to the target of a symlink

我有一个由 Mercurial 控制版本的项目(项目 main)。该项目通过 main 中的符号 link 指向 sub 中的文件来引用(使用)另一个项目 (sub) 中的一些文件。符号 link 添加到 main 的存储库。

问题是 Mercurial 没有检测到在 sub 处对目标文件所做的更改,没有将 symlink 标记为 'M'(已修改)。

情况如下例所示:

创建、初始化并提交初始存储库:

$ mkdir crap
$ cd crap
$ mkdir main sub
$ cd sub
$ nano sub.txt
$ hg init
$ hg add sub.txt 
$ cd ../main/
$ nano main.txt
$ ln -s ../sub/sub.txt ./sub.txt
$ ls -la
total 24
drwxrwxr-x 2 ruslan ruslan 4096 Jan 15 12:51 .
drwxrwxr-x 4 ruslan ruslan 4096 Jan 15 12:48 ..
-rw-rw-r-- 1 ruslan ruslan   20 Jan 15 12:51 main.txt
lrwxrwxrwx 1 ruslan ruslan   14 Jan 15 12:51 sub.txt -> ../sub/sub.txt
$ hg init
$ hg add main.txt sub.txt 
$ hg commit -m "First"
$ cd ../sub
$ hg commit -m "Sub First"
$ hg status ./sub -A
C sub/sub.txt
$ hg status ./main -A
C main/main.txt
C main/sub.txt

现在修改并提交 sub 中的目标:

$ nano ./sub/sub.txt 
$ hg status ./sub -A
M sub/sub.txt
$ hg commit ./sub -m "Modified"
$ hg status ./sub -A
C sub/sub.txt

现在 main 的状态显示引用目标的符号 link 未标记为 'M':

$ hg status ./main -A
C main/main.txt
C main/sub.txt

在没有提交的情况下再次修改 subsub 中显示 'M' 但在 main 中不显示:

$ nano ./sub/sub.txt 
$ hg status ./sub
M sub/sub.txt
$ hg status ./main -A
C main/main.txt
C main/sub.txt

如何正确地让 Mercurial 检测 symlinks 目标的变化?

你不能。对于 security reasons,Mercurial 从不遍历符号链接。

在使用 ln 创建时,您可以通过省略 -s 参数来使用硬 link。

我建议明确附加 .hardlink,并将 ls 修改为 highlight hardlinks

在 windows 机器上,我使用了相同的方法 Link Shell Extension 效用;我捐给了作者,你也应该这样做 :)。