2010-04-07 3 views
12

Ok, quindi abbiamo recentemente convertito da SVN a Mercurial.
Utilizziamo normalmente TortoiseHG.

Nel nostro unico repository abbiamo tutti i nostri progetti, C++/.NET/ASP. Abbiamo circa 100 progetti, tutti con progetti di libreria comuni.

Quindi sarebbe molto difficile creare più repo per ciascun progetto.

Ora, abbiamo il ramo default e diciamo branchA.
Sto lavorando su BranchA e aggiungendo le mie modifiche uber ad esso, e ho cambiare una libreria comune, diciamo un metodo di estensione
Mercurial Fusione solo di alcuni changeset

voglio commettere questo a branchA e default, come potrei fare per questo?

Tuttavia, non voglio che tutti i miei cambia da branchA per essere fuse in default, e io non voglio tutte le altre modifiche da default

Speriamo che questo sia informazioni sufficienti!

+2

Questo è il modo sbagliato di utilizzare il controllo della versione per gestire i progetti. Se si dispone di una libreria condivisa tra diversi progetti, la libreria dovrebbe avere il proprio repository. Gestire manualmente cambiamenti come questo ti causerà infiniti problemi a lungo termine. –

+0

@PeterGraham I mega-repos sono utilizzati in aziende molto grandi come [Facebook] (https://code.facebook.com/posts/218678814984400/scaling-mercurial-at-facebook/) con un buon successo. – Fowl

risposta

11

C'è un modo per evitare questo problema. È possibile make all your changes on separate feature branches from some baseline revision, in genere il tag dell'ultima versione o qualche altro punto stabile S.

In questo modo, la modifica X sarà sulla propria filiale che possono essere fusa con altre filiali (fonde M1 e M2) senza introdurre gruppi di modifiche indesiderate:

-----S--o----o---M1----o---> default 
    |  /
    |---------X feature or bugfix 
    |   \ 
    \--o---o----M2----o-----> BranchA 

Ciò richiede soltanto normali hg merge operazioni; nessuna necessità di patch, Transplant o MQ.

-1

Si sta descrivendo "cherry picking" o si esegue una "unione parziale" che non è attualmente possibile con Mercurial. Avete alcune opzioni:

  • Separare il codice comune nel proprio repository.
  • Generare un differenziale delle modifiche apportate al codice comune e applicarlo al ramo default.
+0

Downvoted perché mercurial supporta il cherry picking. Mercurial lo chiama "trapianto" ed è disponibile usando l'estensione del trapianto. –

5

Se si separa il codice comune nel proprio repository, è possibile utilizzare i sottorepos per includerlo in ciascun progetto.

A proposito, I consiglia di disporre di un repository separato per ogni progetto, soprattutto se ce ne sono così tanti.

22

Solo per mantenere le cose un po 'aggiornate: c'è lo graft command che implementa il cherry-picking in Mercurial.

Questo comando utilizza la logica di unione di Mercurial per copiare singole modifiche da altri rami senza unire rami nel grafico storia. Questo è talvolta noto come "backporting" o "cherry-picking". Con il valore predefinito , l'innesto copierà utente, data e descrizione dai changeset di origine .