2012-04-10 12 views
10

Il corto di ciò che è di seguito: Voglio spingere i messaggi di commit in una sottostruttura, ma solo i messaggi che si applicano a quell'albero. Come faccio a fare questo?git subtree push change to subtree project


ho due progetti, Master e Slave. Slave viene estratto come una sottostruttura di Master estratto da lib/slave via git subtree merge --prefix=lib/slave --squash projects/slave dove projects/slave è un ramo che Slave è stato estratto in:

Filiali:

maestri progetti/slave → Slave

Ora Sto lavorando sul mio ramo master, effettuando commit su file che fanno parte di entrambi i progetti, tutto procede senza intoppi. Ora voglio spingere modifiche al Slave:

  • git checkout schiavo
  • git merge ??? master

Se eseguo un'unione normale, viene eseguito il commit di ogni commit da master, anche se non sono stati modificati file in lib/slave. Oppure posso fare un --squash e ottenere solo un singolo commit, ma perdo i messaggi di log.

Quindi, come posso ottenere i messaggi di registro appropriati? per esempio. se il mio master storia di log è:

  • immagini aggiunti a padroneggiare
  • file modificati in schiavo solo
  • più cambiamenti di padroneggiare solo
  • file modificati nel master e slave

I' d lo voglio aggiunto a Slave:

  • file modificati in schiavo solo
  • file modificati in master e slave
+0

Gitslave (http://gitslave.sourceforge.net/) potrebbe essere stata un'alternativa interessante nel tuo caso. – VonC

+0

@VonC - Uno dei problemi principali che vedo con gitslave è che sembra lanciare i comandi a ciascun repository, facendo effettivamente 'git commit -m" messaggio di commit "" su ciascun repository.Quindi se qualche sviluppatore non lo sta utilizzando, stiamo per incontrare problemi di sincronizzazione, giusto? –

+0

Forse la domanda più stupida del mondo, ma perché non c'è 'git log ' sufficiente qui? Questo ti darà solo le modifiche pertinenti al tuo ramo di schiavo quando lo pubblichi nelle tue directory. Il tuo dolore nel disordine del cambiamento, o è solo nel display? – MrGomez

risposta

6

Per il comportamento desiderato, penso che dovrete spingere da Master, non so di un modo per tirare modifiche sottostruttura da Slave.

Per spingere le modifiche:

(in Master) 
$ git subtree split --prefix=lib/slave -b split-branch 
$ git push <bare Slave repo> split-branch:master 
$ git branch -d split-branch 
$ cd /path/to/Slave/working/copy 
$ git pull # (now in Slave) 

Il primo comando crea una nuova sotto-albero in base alla directory, che viene poi spinto verso l'altro progetto.

In teoria, si dovrebbe essere in grado di passare direttamente a una copia di lavoro, ma in pratica non ha funzionato per me.

+0

Non ero sicuro del motivo per cui non mostri un comando 'git subtree push', ma poi ho capito (dai git della sottostruttura docs) che una sottostruttura push è solo una suddivisione della sottostruttura seguita da una spinta regolare al repository alternativo. – yoyo