2009-08-17 10 views
43

Ho visto un certo numero di post sul blog e ho sperimentato personalmente che Mercurial non conserva le autorizzazioni sui file trasferiti da un repository all'altro. Qualcuno sa di un'estensione Mercurial che preserverebbe le autorizzazioni? Suppongo che non possa essere eseguito con un hook, perché cosa sa un hook sulle autorizzazioni al repository di origine?È possibile eseguire Mercurial per preservare le autorizzazioni dei file?

elaborazione richiesto:

  • Se l'unica modifica a un file è un cambiamento di permessi (ad esempio chmod o+r filename), tenta di commettere il file fallire con un messaggio che dice che il file non è cambiato.

  • Se commetto un file con permessi 600 (rw -------), quindi clonare il repo, lo stesso file nel clone dispone di autorizzazioni 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 
    

Questo esempio dimostra che hg clone non preserva i permessi, ma hg push non conservi la loro neanche.

Nella mia applicazione, un pronti contro termine è in un percorso accessibile al pubblico, ed è di grande importanza che

  • Più utenti hanno il diritto di modificare il repo

  • file nel repository pubblico diventare leggibile solo se esplicitamente reso leggibile.

+0

Puoi approfondire un po 'questo? Posso modificare le autorizzazioni sui miei file locali, eseguire il commit delle modifiche, inviarle a un clone e il clone, quando lo aggiorno, modificherà le autorizzazioni. La chiave è che devo impegnarmi e aggiornarmi. Vuoi che il clonato spinga a cambiare i permessi solo dalla push? Per notare le modifiche locali senza il commit? Per dedurre tutte le autorizzazioni * esistenti *? Qual è il problema esatto/cosa mi sto perdendo? – quark

+0

@quark: come è fatto? Sto usando hg 1.2.1 su Debian Linux e non riesco nemmeno a capire che un cambiamento nel permissino è un cambiamento che vale la pena di commettere. (NB Ho elaborato come da tua richiesta.) –

+0

Norman: scopre che quello che mi manca è il fatto che vuoi tenere premuto per passare a "r" e "w", e quello di cui sto parlando sono i cambiamenti a "x" (che Mercurial ha tracciato da 0.6). Avrei dovuto capire che intendevi leggere/scrivere non eseguibile. – quark

risposta

32

sembra che può essere fatto utilizzando ganci e uno strumento ausiliario (e un po 'gomma da masticare e filo di balle):

  1. Get David Hardeman di Metastore, che salva e ripristina i metadati del file.

  2. Modificare le origini in modo da ignorare la directory .hg e .git.

  3. Utilizzare i seguenti ganci Mercurial:

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

È necessario aggiungere il file .metadata al repo.

Questa lashup funzionerà la maggior parte del tempo, ma se si cambia solo permessi e desidera propagare esso, dovrete eseguire metastore -s al fine di spingere le modifiche nel file .metadata dove hg vedrà la modificare; altrimenti il ​​commit pensa che nulla è nuovo.

+0

a Devid Hardeman's è obsoleto. Nuovo link: https://github.com/przemoc/metastore.git – Speakus

+0

BTW. Qui: http://stackoverflow.com/a/17583212/751932 è stato menzionato uno strumento in più git-cache-meta.sh https://gist.github.com/Cojad/9205547 – Speakus

-1

Non è consigliabile archiviare le autorizzazioni in VCS. Tuttavia, Mercurial supporta il flag "eseguibile" (che non è uguale alle autorizzazioni, anche se il flag eseguibile di Unix è parte delle autorizzazioni).

+3

Potrebbe non essere una buona idea in generale, ma nella mia applicazione le autorizzazioni sono metadati critici e devono essere corretti. DVCS non è lo strumento ideale ma sembra il migliore disponibile. Il collegamento –

16

Cosa succede ad usare questa soluzione dalla Mercurial FAQ:

Se stai usando Mercurial per config la gestione dei file, si potrebbe desiderare di proprietà del file binario (proprietà e permessi) troppo. Mercurial solo tiene traccia del bit eseguibile di ciascun file .

Ecco un esempio di come salvare le proprietà lungo con i file (funziona su Linux se hai la ACL pacchetto installato):

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

Questo è ben lungi dall'essere perfetto, ma tu hai l'idea. Per una soluzione più sofisticata, dai un'occhiata a etckeeper.

Problemi correlati