2010-03-09 3 views
99

Sto cercando di salvare solo determinati file con Mercurial. A causa dell'hg che si aggiunge automaticamente ogni volta che provo a commettere una modifica, vuole impegnare tutti i file. Ma non lo voglio perché alcuni file non sono ancora "pronti".Mercurial (hg) esegue il commit solo di determinati file

C'è

hg commit -I thefile.foo 

ma questo è solo per un file. Il modo migliore per me sarebbe se potessi disattivare l'auto-aggiunta come in Git. È possibile?

+5

utilizzare l'estensione di registrazione? oppure puoi specificare i file nella riga di comando 'hg ci foo bar baz' – tonfa

+3

@tonfa, ripubblicare il tuo commento come risposta – develop7

+0

Si prega di non vandalizzare i tuoi messaggi. – Glorfindel

risposta

133

È possibile specificare i file sulla riga di comando, come tonfa scrive:

$ hg commit foo.c foo.h dir/ 

che funziona e questo è quello che faccio tutto il tempo. È inoltre possibile utilizzare il flag --include che hai trovato, e lo si può utilizzare più volte in questo modo:

$ hg commit -I foo.c -I "**/*.h" 

Si può anche utilizzare un fileset per selezionare i file che si desidera impegnarsi:

$ hg commit "set:size(1k - 1MB) and not binary()" 

Non ci sono impostazioni che disattivano il comportamento di auto-aggiunta e fanno in modo che Mercurial funzioni come Git. Tuttavia, il mq extension potrebbe essere di interesse. Che è un'estensione avanzata, ma permette di fare a

$ hg qnew feature-x  # create new patch 
$ hg qrefresh -s foo.c # add a file to the current patch 
$ hg qrefresh -s bar.c # add another file to the patch 
$ hg qfinish -a   # convert applied patches to normal changesets 

Io in realtà non lo uso MQ per questo scopo io stesso, però, dal momento penso che sia sufficiente specificare solo i nomi dei file sulla riga di comando.

0

Come suggerito in this Stack Overflow question, il modo più semplice per farlo è con hg shelve.

+1

In che modo accantonare l'aiuto per questo? Capisco che se accetti il ​​cambio di filiale o qualcosa che si lamenta delle modifiche in sospeso, ma per il commit selettivo, devi semplicemente selezionare ciò che devi impegnare. – amertkara

+0

Sicuramente non il ** modo più semplice **, ma funziona. È simile a 'git stash': rimuove quello che vuoi dalla tua attuale directory di lavoro, permettendoti di salvare solo ciò che rimane. – marcelocra

20

Se si desidera salvare alcuni file ed escluderne molti altri, elencare in modo esplicito i file che si desidera salvare. -I è necessario solo se si desidera utilizzare modelli anziché file.

Se si desidera memorizzare molti file ed escludere solo alcuni file, utilizzare -X è più conveniente.

E.g. dato un repository contenente "file_1", "file_2" e "file_3", i seguenti sono equivalenti, ma il secondo è più facile/più veloce a digitare:

hg commit file_1 file_2 
hg commit -X file_3 
1

Come di 3.8 è anche possibile utilizzare hg commit --interactive per selezionare i file (prima di 3.8 è possibile utilizzare crecord extension per funzionalità simili). Il flag --interactive (o solo -i) farà sì che hg richieda i file che si desidera includere nel commit. Come bonus aggiuntivo puoi persino includere/escludere blocchi all'interno dei file.

Ecco un esempio di come appare l'interfaccia. Si noti che questo è un vecchio screenshot (di crecord in realtà), quindi l'interfaccia è leggermente cambiata (ma le basi sono le stesse). crecord screenshot

Nota per ottenere quell'interfaccia è necessario l'interfaccia curses attivata.Si può fare per la singola corsa con hg commit --config ui.interface=curses --interactive o in generale con l'aggiunta del seguente al vostro .hgrc:

[ui] 
interface = curses