2009-12-28 14 views
6

पर Mercurial symlinks मैं थोड़ी देर के लिए googling रहा है, लेकिन मैं इस बात का जवाब खोजने में असमर्थ था, काफी सरल, सवाल।विंडोज

Mercurial 1.4 के साथ, जब मैं एक विंडोज क्लाइंट पर एक भंडार क्लोन करता हूं, सिम्लिंक मूल फ़ाइल के पथ वाली फ़ाइल के रूप में दिखाई देते हैं।

मैं बड़े पैमाने पर सिम्लिंक का उपयोग नहीं करता, लेकिन मैं उन्हें साझा लिब हैंडलिंग (libpng.so -> libpng.so.2-> libpng.so.2.43.0 उदाहरण के लिए) का उपयोग करता हूं।

विंडोज बॉक्स केवल परीक्षण के लिए है, जिसका अर्थ है कि यदि मैं मूल फ़ाइल की वास्तविक प्रतियां सिम्लिंक करता हूं तो यह बहुत ही हास्यास्पद होगा, इससे मुझे संकलन करने दिया जाएगा।

मैंने http://markmail.org/message/7d353ucvivhphvvk देखा जो मूल रूप से एक ही सवाल है, लेकिन बिना किसी वास्तविक उत्तर के।

उत्तर

4

अच्छा, सामान्य उत्तर यह है कि कम से कम वीसीएस स्तर पर दर्द के लायक नहीं है। निश्चित रूप से, आपके द्वारा प्रस्तावित समाधान आपके लिए काम करेगा, लेकिन सिमलिंक फ़ाइल प्रतियों को संपादित करने के बारे में क्या: क्या उन्हें भी अपडेट किया जाना चाहिए? क्या होता है जब आप स्रोत को संपादित करते हैं और फ़ाइल को एक अलग तरीके से कॉपी करते हैं? इत्यादि।

फिर भी, कोई भी आपको एक्सटेंशन को लागू करने से रोकता है, या एक साधारण (अपडेट) हुक मूल फ़ाइल के साथ मैनिफेस्ट और ओवरराइटिंग लिंक स्कैनिंग नहीं करता है। यह सिम्लिंक को बदले में बदल देगा लेकिन आपको शायद अपने परीक्षण सेटअप में परवाह नहीं है।

$ hg up -C somerev 

: चल रहा है के साथ

[hooks] 
update = python:c:/path/to/symcopy.py:symcopy 

और परीक्षण:

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 की तरह कुछ डाल में

:

यहाँ हुक कोड (symcopy.py) है जब आप हुक सिमलिंक को संशोधित के रूप में चिह्नित करेंगे, तो आप वास्तव में अपडेट करना चाहते हैं और आप विलय को ट्रिगर नहीं करना चाहते हैं।

शायद fsrc थोड़ा साफ किया जाना चाहिए लेकिन आपको विचार मिलता है।

+0

ठीक है, कि भंडार के लिए, सभी फ़ाइलें सांकेतिक रूप से लिंक केवल खिड़कियों बक्से पर पढ़ा जा सकता है। क्या आपके पास क्या कहने पर कोई सूचक है? –

+0

नमूना हुक जोड़ा – pmezard

+0

बहुत बहुत धन्यवाद, मैं बाकी को समझूंगा। –

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)