7

我已经在谷歌上搜索了一段时间,但我很惊讶无法找到这个非常简单的问题的答案。

使用 mercurial 1.4,当我在 Windows 客户端上克隆存储库时,符号链接显示为包含原始文件路径的文件。

我没有广泛使用符号链接,但我确实将它们用于共享库处理(例如 libpng.so ->libpng.so.2->libpng.so.2.43.0)。

windows 框仅用于测试,这意味着如果符号链接位于原始文件的实际副本中,我会非常高兴,这会让我编译。

我看到http://markmail.org/message/7d353ucvivhphvvk这基本上是相同的问题,但没有任何真正的答案。

4

2 回答 2

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

你真的想在更新时 --clean 因为钩子会将符号链接标记为已修改并且你不想触发合并。

也许fsrc必须清理一下,但你明白了。

于 2009-12-28T17:23:19.563 回答
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 )
于 2012-06-23T16:20:05.680 回答