2009-08-17 10 views
43

Widziałem wiele postów na blogu i doświadczyłem dla siebie, że Mercurial nie zachowuje uprawnień do plików przesyłanych z jednego repo na drugie. Czy ktoś wie o rozszerzeniu Mercurial, które zachowałoby uprawnienia? Zakładam, że nie da się tego zrobić za pomocą haka, bo co wiesz na temat uprawnień na początku repo?Czy można wprowadzić Mercurial, aby zachować uprawnienia do plików?

Zamówiony opracowanie:

  • Jeżeli jedyną zmianą w pliku jest zmiana uprawnień (np chmod o+r filename), usiłuje popełnić plik niepowodzeniem z komunikat, że plik nie został zmieniony.

  • Jeśli popełnienia pliku z uprawnieniami 600 (rw -------), a następnie sklonowanie transakcji warunkowych, z tego samego pliku w klonie uprawnieniami 664 (rw-rw-r--)

    : nr[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 
    

Przykład ten pokazuje, że hg clone nie zachowuje uprawnienia, ale hg push nie zachowuje je albo.

W mojej aplikacji, jeden repo jest na publicznie dostępnej ścieżki, a to niezwykle ważne, aby

  • Wielu użytkowników ma prawo do zmiany repo

  • plików w repo publiczny stać czytelny tylko wtedy, gdy jest wyraźnie czytelny.

+0

Czy możesz trochę o tym powiedzieć? Mogę zmienić uprawnienia do moich plików lokalnych, zatwierdzić zmiany, przekazać je do klonu, a klon, gdy go zaktualizuję, zmieni uprawnienia. Kluczem jest to, że muszę zarówno zatwierdzać, jak i aktualizować. Czy chcesz, aby pchnął do klonowania, aby zmienić uprawnienia tylko z push? Aby zauważyć lokalne zmiany bez zatwierdzenia? Aby wywnioskować wszystkie * istniejące * uprawnienia? Jaki jest dokładny problem/czego mi brakuje? – quark

+0

@quark: Jak to się robi? Używam hg 1.2.1 na Debianie Linux i nie mogę nawet zgadnąć, że zmiana w permisinos jest zmianą wartą popełnienia. (NB opracowałem zgodnie z twoją prośbą). –

+0

Norman: okazuje się, że brakuje mi tego, że chcesz trzymać się "r" i "w", a to, o czym mówię, to zmiany do "x" (który Mercurial śledził od 0,6). Powinienem był sobie uświadomić, że chodzi ci o odczyt/zapis, który nie jest wykonywalny. – quark

Odpowiedz

32

Wygląda jak można to zrobić za pomocą haków i narzędzia pomocniczego (i trochę gumy do żucia i drutem):

  1. Get David Hardeman na Metastore, który zapisuje i przywraca metadanych pliku.

  2. Zmień źródła, aby zignorować katalog .hg, a także .git.

  3. Użyj następujących Mercurial haki:

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

Trzeba dodać plik .metadata do repo.

Ten lashup będzie pracować przez większość czasu, ale jeśli zmienisz tylko uprawnień i chcesz ją propagować, musisz uruchomić metastore -s żeby pchnąć te zmiany w pliku .metadata gdzie hg będzie zobaczyć zmiana; w przeciwnym razie commit uważa, że ​​nic nie jest nowe.

+0

link do Devid Hardeman's jest przestarzały. Nowy link: https://github.com/przemoc/metastore.git – Speakus

+0

BTW. Tutaj: http://stackoverflow.com/a/17583212/751932 wspomniano o jeszcze jednym narzędziu git-cache-meta.sh https://gist.github.com/Cojad/9205547 – Speakus

-1

Nie jest dobrym pomysłem przechowywanie uprawnień w VCS. Jednak Mercurial obsługuje "wykonywalny" flag (to nie to samo, co uprawnienia, chociaż w wykonywalnej flagie Unix jest częścią uprawnień).

+3

To może nie być dobry pomysł, ale w mojej aplikacji uprawnienia są najważniejszymi metadanymi i muszą mieć rację. DVCS nie jest idealnym narzędziem, ale wydaje się najlepiej dostępne. –

16

Co na temat korzystania z tego rozwiązania z Mercurial FAQ:

Jeśli używasz Mercurial dla config zarządzania plikami, może chcesz właściwości pliku Track (własności i uprawnień ) too. Tylko Mercurial śledzi bit pliku wykonywalnego każdego pliku .

Oto przykład, w jaki sposób zapisać właściwości oraz pliki (działa na Linux, jeśli masz acl pakiet zainstalowany):

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

ten jest daleki od doskonałości, ale masz pomysł. Aby uzyskać bardziej wyrafinowane rozwiązanie, sprawdź etcheeper .