Windows上的Mercurial符号链接

时间:2009-12-28 04:33:58

标签: windows mercurial symlink

我一直在谷歌搜索一段时间,但我很惊讶无法找到答案,非常简单,问题。

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

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

Windows框仅用于测试,这意味着如果符号链接原始文件的实际副本,我会非常讨厌,这将让我编译。

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

2 个答案:

答案 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 )