2009-05-19 18 views
38

C'è un modo per ignorare le modifiche ad alcuni file su un commit con mercurial?Esiste un'opzione ignore-on-commit in mercurial?

Ho una situazione specifica in cui abbiamo un file tnsnames.ora oracle predefinito che punta a 127.0.0.1, ma alcuni sviluppatori lo modificheranno per puntare ad altri sistemi, ma non vogliamo modificare il valore predefinito file.

in Subversion, ho semplice aggiunto questo al changelist ignore-on-commit. C'è un modo per farlo in modo mercuriale?

risposta

48

Se i file che si desidera omettere dal comando "hg commit" sono già "monitorati", è necessario utilizzare l'opzione -X. Il modello passato a -X è abbastanza flessibile, permettendo di eseguire, ad esempio:

% hg stat 
A etc/foo.conf 
M src/bar.c 
M lib/libbar/loader.c 
% hg commit -X '**.conf' 

per evitare di commettere qualsiasi file con estensione ".conf", indipendentemente da quanto in profondità nell'albero dei sorgenti vive. Nello spazio di lavoro mostrato sopra questo commetterebbe "src/bar.c" e "lib/libbar/loader.c" ma non "etc/foo.conf".

Per escludere più modelli di nomi di file, utilizzare più opzioni -X, cioè .:

% hg commit -X '**.conf' -X '**.sh' 
+8

Vedere "schemi guida hg" per informazioni sui modelli di stile "**. Conf". –

+0

C'è un modo per renderlo permanente? Non voglio -X su ogni commit. – Kugel

+0

@Kugel Non sembra. Mercurial mi colpisce come una scelta pessima per un codebase con 20 file di configurazione che contengono tutti elementi specifici dell'utente. Non dovrei scrivere script per far funzionare il controllo della versione per me piuttosto che contro di me. E no, neanche i 20 file di configurazione erano una mia idea. Immagino che anche quel tizio abbia scelto anche Mercurial. –

-2

Cercare il file .hgignore nella documentazione di Mercurial.

Ecco un esempio di file ignore.

 # use glob syntax. 
     syntax: glob 

     *.elc 
     *.pyc 
     *~ 

     # switch to regexp syntax. 
     syntax: regexp 
     ^\.pc/ 
+0

Il file tnsnames.ora è già selezionata. Voglio ignorare le mie modifiche locali, perché sono solo per la mia macchina. Questo è il motivo per cui .hgignore non funziona –

1

Si potrebbe alias impegnarsi per qualcosa come 'hg commit excluded_file.ext -X' Non ho mai usato Mercurial, quindi sto solo andando dalla pagina man qui.

21

Tradizionalmente, questo è risolto, non delle versioni del file stesso, ma per versioni una copia di esso come modello per gli altri per l'uso.

così si sarebbe hg mv tnsnames.ora tnsnames.ora-template, poi impegnarsi, poi fare una copia del file system rettilineo di tnsnames.ora-modello per tnsnames.ora, e aggiungere tnsnames.ora al file .hgignore.

modifiche successive al modello sarà comunque ottenere spinto fuori, ma non sarà effettivamente cambiare l'ambiente di lavoro a meno che qualcuno copia il modello per il file vero e proprio.

+1

Quindi se hai app.config e lo rinominerai in app.config-template non ci sarà più un'app.config nel repository. Ciò causerà problemi con una build automatizzata. Presumo che il processo di compilazione debba essere informato di questo "modello" e rinominarlo. Questo non è eccezionale. – AndyM

+2

Non si desidera rinominare, si desidera copiare e modificare. Puoi farlo dai tuoi script autobuild o puoi farlo da un hook, ma in entrambi i casi se hai file che saranno diversi da clone a clone ci sarà un po 'di intelligenza applicata da qualche parte. – Zed