如何让 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
在没有提交的情况下再次修改 sub
在 sub
中显示 '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 效用;我捐给了作者,你也应该这样做 :)。
我有一个由 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
在没有提交的情况下再次修改 sub
在 sub
中显示 '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 效用;我捐给了作者,你也应该这样做 :)。