2012-07-11 10 views
7
  1. Ho un repo di Mercurial radice (sito Web).
  2. I clone WordPress da GitHub mirror nella sottodirectory /wp.
  3. Dal momento che voglio una versione molto specifica (stabile) di WP, ma non sviluppo in corso, faccio git checkout 3.4.1 (dove 3.4.1 è tag).
  4. L'ho impostato come subrepo nella radice Mercurial repo e commit (la revisione di WP viene acquisita correttamente in .hgsubstate).

E qui iniziano i guai. Faccio hg push e quando si arriva a WP:Come riparare Mercurial bloccato su Git subrepo push?

no branch checked out in subrepo wp 
cannot push revision e9bc63e25dc40c07ac3a6778dc2b48e1aa486e36 

E poi appena si chiude. Spingere per il repository root non è nemmeno tentato.

capisco perché Mercurial cerca per spingere subrepo (comportamento previsto), ma non riesco a dare un senso perché si riesce a fallire completamente il subrepo che:

  1. non ci sono cambiamenti
  2. ha letto -solo origine comunque

Come far capire che voglio questa revisione specifica e non voglio che scherzi con Git subrepo?

risposta

2

Si verificheranno un paio di problemi con questa configurazione.

In primo luogo, sembra che mercurial non possa gestire subrepos di git con un HEAD distaccato.

Quando si esegue git checkout 3.4.1, il repository entra in uno stato detached HEAD (avresti dovuto vedere un avviso a tale effetto quando hai eseguito il comando). A quel punto, se esegui git branch, vedi che (no branch) è elencato come ramo attivo. Quando i tentativi mercuriali di spingere, soffoca su questo stato. Potresti chiedere allo mercurial developer list perché ciò accada, ma probabilmente è una limitazione dell'implementazione del subrepo esistente.

Secondo, mercurial utilizza un comando push per sincronizzare git subrepos.

Se si dovesse eseguire git checkout -b <integration_branch> 3.4.1, si sposta git dallo stato HEAD distaccato. Tuttavia, quando si tenta di hg push, tenterà di spingere effettivamente al repository git remoto. Per un subrepo mercuriale, è possibile verificare le modifiche in uscita anche se non si dispone dell'accesso push al telecomando. Tuttavia, GitHub richiede l'autenticazione prima che ti comunichi se i due repository sono sincronizzati. Quindi, se non hai accesso push al git remote, questo fallirà. Questo fa parte del progetto della strategia del subrepo di Mercurial.

Se è necessario continuare con questa configurazione, probabilmente si dovrebbe effettuare le seguenti operazioni:

  1. Creare la tua forcella del repo WordPress su GitHub.
  2. Clona la tua forcella nella directory di mercurial subrepo.
  3. git checkout -b <branch_name> 3.4.1
  4. Continua da lì

Ci sono alcune informazioni aggiuntive in questa related question.

+0

Sì, sembra che il problema della distacco sia qui (anche se lo vedo come una carenza di Git non Mercurial - se non ha nulla da spingere che cosa importa il ramo attivo? ..). Il tuo secondo punto sembra essere un non-problema, tuttavia, gli altri sottosistemi di GitHub aggiornati per la revisione delle tip funzionano bene. La mia soluzione attuale è quella di creare e utilizzare Mercurial mirror di WordPress, ma sono comunque interessato se questa roba staccata può essere fatta funzionare come subrepo senza clonare e ramificare le cose intorno ... – Rarst

+0

@Rarst: finché gli altri sottotipi di GitHub puntano a 'tip ', andrà bene. Ma non appena crei un ramo git locale per usare una revisione precedente (ad esempio usa un tag più vecchio, senza un HEAD distaccato), otterrai lo stesso errore. –