2009-08-17 35 views
43

Tôi đã nhìn thấy một số bài đăng trên blog và đã trải nghiệm cho chính mình, rằng Mercurial không bảo lưu quyền đối với các tệp được đẩy từ repo này sang repo khác. Có ai biết về một phần mở rộng Mercurial mà sẽ bảo vệ các điều khoản? Tôi giả định rằng nó không thể được thực hiện với một cái móc, bởi vì những gì hiện một móc biết về quyền truy cập tại repo có nguồn gốc?Mercurial có thể được thực hiện để bảo vệ quyền truy cập tập tin?

xây dựng yêu cầu:

  • Nếu thay đổi duy nhất vào một tập tin là một sự thay đổi trong điều khoản (ví dụ, chmod o+r filename), cố gắng thực hiện các tập tin thất bại với một thông báo nói rằng các tập tin không thay đổi.

  • Nếu tôi cam kết tệp có quyền 600 (rw -------), sau đó sao chép repo, cùng một tệp trong bản sao có quyền 664 (rw-rw-r--):

    : [email protected] 6522 ; hg clone one two 
    updating working directory 
    1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
    : [email protected] 6523 ; ls -l one two 
    one: 
    total 4 
    -rw------- 1 nr nr 8 Aug 18 21:50 foo 
    
    two: 
    total 4 
    -rw-rw-r-- 1 nr nr 8 Aug 18 21:51 foo 
    

ví dụ này cho thấy hg clone không giữ gìn quyền, nhưng hg push không gìn giữ họ trong hai.

Trong ứng dụng của tôi, một repo là trên một con đường truy cập công khai, và nó có tầm quan trọng lớn

  • Nhiều người dùng có quyền thay đổi các repo

  • tập tin trong repo công cộng trở thành chỉ đọc được khi có thể đọc được một cách rõ ràng.

+0

Bạn có thể giải thích một chút về điều này không? Tôi có thể thay đổi quyền trên các tệp cục bộ của mình, cam kết thay đổi, đẩy chúng vào bản sao và bản sao sẽ, khi tôi cập nhật, thay đổi quyền. Chìa khóa ở đây là tôi phải cam kết và cập nhật. Bạn có muốn đẩy bản sao để thay đổi quyền chỉ từ đẩy? Để nhận thấy các thay đổi cục bộ mà không có cam kết? Để phỏng đoán tất cả các quyền * hiện có *? Vấn đề chính xác/tôi đang thiếu gì? – quark

+0

@quark: Làm thế nào nó được thực hiện? Tôi đang sử dụng hg 1.2.1 trên Debian Linux và thậm chí tôi không thể nhận ra rằng sự thay đổi trong permissinos là một sự thay đổi đáng giá. (NB Tôi đã xây dựng theo yêu cầu của bạn.) –

+0

Norman: chỉ ra những gì tôi đang thiếu là một thực tế mà bạn muốn giữ để thay đổi để "r" và "w", và những gì tôi đang nói về là thay đổi thành "x" (Mercurial đã theo dõi từ 0,6). Tôi nên nhận ra rằng bạn có nghĩa là đọc/ghi không thực thi được. – quark

Trả lời

32

Dường như nó có thể được thực hiện bằng móc và công cụ phụ trợ (và nhai kẹo cao su và dây baling ít):

  1. Nhận David Hardeman của Metastore, giúp tiết kiệm và khôi phục tập tin siêu dữ liệu.

  2. Thay đổi các nguồn để nó sẽ bỏ qua thư mục .hg cũng như .git.

  3. Sử dụng móc Mercurial sau:

    precommit.meta = metastore -s 
    
    changegroup.update = hg update 
    update.meta = /usr/unsup/nr/bin/metastore -a 
    

Bạn phải thêm file .metadata đến repo.

lashup này sẽ làm việc hầu hết thời gian, nhưng nếu bạn thay đổi chỉ quyền và muốn truyền nó, bạn sẽ phải chạy metastore -s nhằm thúc đẩy những thay đổi vào file .metadata nơi hg sẽ thấy thay đổi; nếu không cam kết không có gì mới.

+0

liên kết với Devid Hardeman là lỗi thời. Liên kết mới: https://github.com/przemoc/metastore.git – Speakus

+0

BTW. Ở đây: http://stackoverflow.com/a/17583212/751932 đã được đề cập thêm một công cụ git-cache-meta.sh https://gist.github.com/Cojad/9205547 – Speakus

-1

Bạn không nên lưu trữ quyền trong VCS. Tuy nhiên, Mercurial hỗ trợ cờ "thực thi" (không giống như các điều khoản, mặc dù trong cờ thực thi Unix là một phần của các điều khoản).

+3

Nó có thể không phải là một ý tưởng tốt nói chung, nhưng trong ứng dụng của tôi, các điều khoản là siêu dữ liệu quan trọng, và họ phải đúng. DVCS không phải là công cụ lý tưởng nhưng có vẻ là công cụ tốt nhất. –

16

gì về việc sử dụng giải pháp này từ Mercurial FAQ:

Nếu bạn đang sử dụng Mercurial cho quản lý tập tin cấu hình , bạn có thể muốn tính theo dõi tập tin (quyền sở hữu và quyền ) quá. Mercurial chỉ theo dõi bit thực thi của mỗi tệp .

Dưới đây là một ví dụ về cách lưu tính cùng với các tập tin (chỉ hoạt động trên Linux nếu bạn đã là acl gói cài đặt):

# cd /etc && getfacl -R . >/tmp/acl.$$ && mv /tmp/acl.$$ .acl 
# hg commit 

này còn xa mới hoàn hảo, nhưng bạn hiểu ý rồi đấy. Để có giải pháp tinh vi hơn, hãy xem người ghi chú.

1

Đối với trường hợp cụ thể của thư mục/etc, etckeeper có vẻ thú vị.

Các vấn đề liên quan