2010-09-13 18 views
6

Ho una struttura TFS molto caotica che sto cercando di ripulire (grazie al mio predecessore). Ora ho una situazione in cui ho bisogno di portare i changeset in modo selettivo da un ramo all'altro dove non hanno una relazione genitore/figlio e non voglio che queste modifiche passino attraverso il loro tronco condiviso. Come posso fare questo?In TFS, come posso selezionare un changeset in un ramo non correlato?

Ho provato un'unione senza base - In TFS, how do I do a baseless merge on specific changesets? - che mi ha detto che non ci sono stati cambiamenti da unire.

Quello che voglio ottenere è qualcosa di simile a questo TFS : Can a shelveset be restored to another location? tranne che con un changeset.

In GIT penso che questo sarebbe un semplice cherry-pick.

La mia struttura simile a:

Y-C1-C2-C3 
/
X------------- 
    \ 
    Z 

E la domanda è come ottengo C2 da Y in Z senza passare per X?

+0

Quali opzioni hai usato nel tuo tentativo di unione senza base? Hai usato l'opzione/force? –

+0

Sì, ho provato la forza e alcune altre cose che ho letto in giro ma con lo stesso risultato - che non c'erano modifiche. Alla fine ho morso il proiettile e ho fuso tutto manualmente ... ci sono volute 14 ore ma almeno sono sicuro al 100% del risultato. – idieeasy

risposta

3

Abbiamo una situazione simile, tuttavia, nel nostro caso, eseguiamo un'unione senza fondamento da più rami in un ramo di build "zero". L'unico modo in cui siamo riusciti a farlo è scrivendo la nostra utility sfruttando l'API TFS.

La buona notizia è che dovresti riuscire a farlo in meno di duecento righe di codice.

I passaggi fondamentali sono:

  • Connect to TFS
  • ottenere un'istanza del VersionControlServer (chiamiamolo VCS)
  • creare un'area di lavoro
  • fare un VCS.GetChangeset()
  • Scorrere il Changes per ottenere un elenco di elementi che sono stati modificati
  • Eseguire un Workspace.Merge per ciascuno degli articoli dal tuo ramo di origine al tuo ramo di destinazione.
  • Verificare gli articoli nel ramo di destinazione.
  • lavoro Elimina
+0

Sembra che questo sia l'unico modo per andare da parte manualmente (cosa che ho fatto piuttosto che tenere il mio team). Dovrebbe essere un problema semplice/comune? – idieeasy

+0

Le best practice dicono che non dovresti scegliere tra le ciliegie. Se lo fai molto, c'è un problema con la tua strategia di ramificazione. Potresti invece prendere in considerazione la possibilità di utilizzare la funzione di diramazione sulla funzione. Nella nostra situazione lo facciamo per le build di prova. – Robaticus

+0

Hai perfettamente ragione, c'era un problema con la strategia di ramificazione e questa domanda è sorto mentre stavo tentando di riorganizzare i rami in modo da non creare così tanti problemi di fusione. – idieeasy

1

La sua più semplice per farlo utilizzando Visual Studio.

In Visual Studio utilizzare la procedura guidata Unisci controllo sorgente per unire i rami non correlati.

Ha un'opzione per unire i changeset selettivi. L'unica limitazione è che i changeset devono essere consecutivi

+0

Se si desidera unire i changeset non consecutivi, basta ripetere l'apertura di Source Control Merge Wizard fino a quando non si è finito. Puoi scegliere di eseguire il commit tra ogni unione o in un commit alla fine. –

Problemi correlati