2009-12-28 4 views
6

Tôi đã googling một lúc nhưng tôi đã rất ngạc nhiên khi không thể tìm thấy câu trả lời cho câu hỏi này, khá đơn giản.Mercurial symlinks trên Windows

Với 1,4 nhân bản, khi tôi sao chép một kho lưu trữ trên máy khách Windows, các liên kết tượng trưng xuất hiện dưới dạng tệp chứa đường dẫn đến tệp gốc.

Tôi không sử dụng liên kết tượng trưng rộng rãi, nhưng tôi sử dụng chúng để xử lý lib dùng chung (libpng.so -> libpng.so.2-> libpng.so.2.43.0 chẳng hạn).

Hộp cửa sổ ở đây chỉ để thử nghiệm, có nghĩa là tôi sẽ rất hapy nếu các liên kết tượng trưng nơi các bản sao thực sự của tệp gốc, điều này sẽ cho phép tôi biên dịch.

Tôi thấy http://markmail.org/message/7d353ucvivhphvvk về cơ bản là cùng một câu hỏi nhưng không có bất kỳ câu trả lời thực sự nào.

Trả lời

4

Vâng, câu trả lời thông thường là nó không đáng để giảm đau, ít nhất là ở cấp VCS. Chắc chắn, giải pháp bạn đề xuất sẽ làm việc cho bạn, nhưng những gì về việc chỉnh sửa các bản sao tệp được liên kết với nhau: chúng có được cập nhật không? Điều gì xảy ra khi bạn chỉnh sửa nguồn và sao chép tệp theo cách khác? Và kể từ đó trở đi.

Tuy nhiên, không ai ngăn bạn triển khai tiện ích hoặc móc đơn giản (cập nhật) quét các liên kết tệp kê khai và ghi đè bằng tệp gốc. Nó sẽ làm cho các liên kết trông giống như thay đổi nhưng bạn có thể không quan tâm đến thiết lập thử nghiệm của bạn.

Đây là mã móc (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(), '') 

Sau đó, trong repo HGRC đặt một cái gì đó như:

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

Và thử nghiệm với chạy:

$ hg up -C somerev 

Bạn thực sự muốn --clean khi cập nhật kể từ khi móc sẽ đánh dấu các liên kết đã được sửa đổi và bạn không muốn kích hoạt hợp nhất.

Có lẽ fsrc phải được làm sạch một chút nhưng bạn có ý tưởng.

+0

Vâng, đối với kho lưu trữ đó, tất cả các tập tin được symlinked có thể được đọc chỉ trên cửa sổ hộp. Bạn có bất kỳ con trỏ trên làm những gì bạn nói không? –

+0

Mẫu móc thêm – pmezard

+0

Cảm ơn rất nhiều, tôi sẽ tìm phần còn lại. –

3

Sử dụng ví dụ @ pmezard như là một cơ sở, đây là móc ném-cùng của tôi:

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)