Non uso Mercurial, ma mi piacerebbe iniziare, quindi sto leggendo a riguardo. L'unico sistema SCM che ho usato ampiamente è CVS. La maggior parte di ciò che ho letto su Mercurial ha senso e suona bene. Ma sono alternativamente scioccato e perplesso in questo modo con i tag.Come posso sapere sempre tutti i tag in Mercurial?
Un tag è solo un soprannome per un insieme di modifiche (e da 'changeset' abbiamo davvero: lo Stato derivante dal changeset). Freddo. La mappatura dai tag agli ID changeset è memorizzata nel file .hgtags
. Anche bello. Il file .hgtags
è versionato.
Cosa?
Questo ha un sacco di conseguenze controintuitivo. Ad esempio, se commetto un changeset che poi voglio taggare (ad esempio, il codice che formerà la versione 1.0), devo eseguire nuovamente il commit dopo aver effettuato il tagging, per inserire il file di tag aggiornato nel repository. E se poi aggiorno a quel changeset con tag in un secondo momento, la copia di lavoro non conterrà alcuna conoscenza di quel tag. Se faccio un po 'di lavoro, quindi fondando un nuovo ramo (diciamo, per correzioni di bug, verso 1.1), quel ramo non avrà alcuna conoscenza del tag da cui è cresciuto. A meno che non lo copio manualmente, cioè.
E mentre lo sviluppo continua sia sul trunk originale che sul mio nuovo ramo, con tag creati per contrassegnare importanti changeset (la versione 2.0 sul trunk, i rilasci di correzioni 1.1 e 1.2 sul ramo), entrambi i rami procederanno in ignoranza dei tag dell'altro ramo. Quindi, se finisco di lavorare su un ramo e voglio passare ad un particolare changeset su un altro (ad esempio, ho finito il rilascio del bugfix 1.2, ma ora devo iniziare con il bugfix 2.1, basato su 2.0), ora sono riempito. Il mio attuale changeset non sa di 2.0!
Cosa posso fare?
- posso chiedere a qualcuno che sta lavorando sul ramo 2.x di leggere l'identificatore di changeset effettivo per 2.0, e l'uso che in modo esplicito, ma questo è spaventosa.
- Potrei citare i miei rami, così come con i tag, in modo che io potessi saltare attraverso al capo del ramo 2.x, imparando così sui nuovi tag, e poi saltare indietro al tag 2.0. Supponendo che i rami, a differenza dei tag, siano universalmente visibili - è così? Anche se lo fosse, questo sembra goffo.
- È possibile mantenere un singolo file globale
hgtags
al di fuori del repository e utilizzare un paio di hook per inserire una copia su un aggiornamento, sovrascrivendo la copia locale e copiare le modifiche su un commit. Non sono sicuro di come funzionerebbe in un ambiente multiutente, in cui gli sviluppatori stanno spingendo le modifiche a un repository condiviso; Potrei aver bisogno di un repository separato solo per il filehgtags
. - Potrei usare i tag locali, che stanno fuori dal meccanismo di versioning, e quindi evitare l'intero problema. Come con i tag globali condivisi, dovrei mettere in atto un meccanismo per sincronizzare il file
localtags
tra gli sviluppatori.
Nessuna di queste soluzioni sembrano totalmente grande. Cosa dovrei fare?
Un presupposto qui è che sto gestione rami utilizzando rami con nome in un unico repository, piuttosto che repository-per-branch. La situazione sarebbe migliore se avessi fatto il secondo?
@SilentGhost: ho rimosso il tag 'hg' poiché il tag 'mercurial' è molto più utilizzato. Ma forse è stato un errore? –