我一直在谷歌搜索一段时间,但我很惊讶无法找到答案,非常简单,问题。
使用mercurial 1.4,当我在Windows客户端上克隆存储库时,符号链接显示为包含原始文件路径的文件。
我没有广泛使用符号链接,但我确实使用它们进行共享lib处理(例如libpng.so - > libpng.so.2-> libpng.so.2.43.0)。
Windows框仅用于测试,这意味着如果符号链接原始文件的实际副本,我会非常讨厌,这将让我编译。
我看到http://markmail.org/message/7d353ucvivhphvvk基本上是同一个问题,但没有任何真正的答案。
答案 0 :(得分:5)
嗯,通常的答案是不值得痛苦,至少在VCS级别。当然,你提出的解决方案对你有用,但是编辑符号链接的文件副本呢:它们是否应该更新?以不同方式编辑源文件和复制文件时会发生什么?等等。
但是,没有人阻止您实现扩展或简单(更新)挂钩扫描清单并覆盖原始文件的链接。它会使符号链接看起来像已更改,但您可能不关心您的测试设置。
这是钩子代码(symcopy.py):
def symcopy(ui, repo, hooktype, parent1, **kwargs):
ctx = repo[parent1]
for f in ctx:
if 'l' in ctx.flags(f):
# overwrite symlink with original file content
print 'overwriting', f
fsrc = ctx[f].data()
repo.wwrite(f, ctx[fsrc].data(), '')
然后在repo hgrc中提出了类似的内容:
[hooks]
update = python:c:/path/to/symcopy.py:symcopy
跑步测试:
$ hg up -C somerev
你真的想 - 更新时清理,因为钩子会将符号链接标记为已修改,并且你不想触发合并。
或许fsrc
必须清理一下,但你明白了。
答案 1 :(得分:3)
使用@ pmezard的示例作为基础,这是我抛出的钩子:
import os
import os.path
import string
import subprocess
def symlinktojunction( ui, repo, hooktype, parent1, **kwargs ):
ctx = repo[ parent1 ]
for f in ctx:
if 'l' in ctx.flags( f ):
fsrc = ctx[ f ].data()
winf = string.replace( f, "/", "\\" )
winfsrc = string.replace( fsrc, "/", "\\" )
base = os.path.dirname( winf )
winfsrc = os.path.join( base, winfsrc )
print "'%s' is symlink to '%s'" % ( f, fsrc )
os.remove( winf )
subprocess.call( [ "mklink", "/j", winf, winfsrc ], shell = True )