7

私はしばらくグーグルで検索してきましたが、この非常に単純な質問に対する答えが見つからないことに驚きました。

Mercurial 1.4 では、Windows クライアントでリポジトリのクローンを作成すると、元のファイルへのパスを含むファイルとしてシンボリック リンクが表示されます。

私はシンボリックリンクを広範には使用しませんが、共有ライブラリの処理には使用します (libpng.so ->libpng.so.2->libpng.so.2.43.0 など)。

Windows ボックスはテスト用にのみここに用意されています。つまり、元のファイルの実際のコピーのシンボリック リンクをコンパイルできるようになると、非常に嬉しく思います。

基本的に同じ質問ですが、本当の答えはありません。

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(), '')

次に、レポ 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 に答える