2012-10-09 11 views
8

Sto usando git-sottostruttura (da Avery Pennarun). Nel mio attuale repository git ho ovviamente tutti i miei file/cartelle di progetto e una sottostruttura chiamata "lib". Se ora cloniamo questo repository git usando git clone ottengo tutti i file di progetto e il sottoalbero "lib" (tutto come dovrebbe essere). Quello che ho provato ora: ho cambiato qualcosa all'interno della sottostruttura "lib" nel repository clonato e ho provato a trasferire le modifiche al repository remoto della sottostruttura "lib" usando git subtree push, ma non ha funzionato. Qual è il problema? Devo aggiungerlo come sottostruttura prima con git subtree add?sub-albero git: consente di modificare le modifiche da un repository clonato

Thx in anticipo

+0

Come hai aggiunto la sottostruttura al tuo progetto di primo livello? Hai appena creato una directory e clonata? –

+0

Ciao! Ho aggiunto la sottostruttura al mio progetto di livello superiore usando "git subtree add". Forse la mia domanda non è abbastanza chiara: se clonato il repository su un'altra macchina, ho tutti i file di progetto più la sottostruttura "lib". Ora cambio qualcosa nella sottostruttura "lib" nel repository clonato, non posso spingere le modifiche sul server remoto usando "git subtree push", questo è il mio problema. – arge

+0

La risposta è stata d'aiuto? –

risposta

14

di responsabilità, ho il sospetto io sono solo un paio di giorni di fronte a voi istruzionene su sottostruttura :-)

Se si sta usando solo git subtree push non stanno dando sottostruttura informazioni sufficienti per estrarre e spingere le tue modifiche.

Se clonate correttamente il repo, il sottoalbero sarà già lì. La sottostruttura deve essere informata su quale sottostruttura vuoi spingere (anche se ne hai una sola) e deve anche sapere dove spingere - in particolare, non vuoi spingere al repository di primo livello. Quindi, si desidera qualcosa di simile:

git subtree push --prefix=lib [email protected]:arges-github/lib.git master 

Ovviamente il pronti contro termine e refspec dovrebbe essere cambiato per abbinare il vostro repo.

Se si desidera esaminare ciò che sta accadendo qui (e aiuta) la sottostruttura in realtà divide le modifiche che riguardano i file all'interno della sottostruttura in un ramo diverso e quindi la spinge al repository di sottostruttura. Per vedere questo accada, utilizzare subtree split

git subtree split --rejoin --branch=shared-changes --prefix=lib 

Dai un'occhiata al ramo che hai fatto:

git checkout lib-changes 

e, spingere manualmente

git push [email protected]:arges-github/lib.git master 

Se questo non è lavorando allora potrebbe essere che non hai fuso la sottostruttura nel tuo repository. Quando si aggiunge una sottostruttura:

git subtree add --squash --prefix lib [email protected]:arges-github/lib.git master 

è anche necessario per unire la sottostruttura e spingerlo di nuovo al vostro repo livello superiore.

+0

Ho eseguito i passaggi fino a "Aggiungi". Non ho trovato alcuna documentazione che suggerisca che sia necessario un "pull" successivo. Cosa succederebbe se il primo "pull" iniziale non venisse eseguito nella sottostruttura dopo "aggiungi"? Il problema che sto affrontando è che anche dopo "aggiungi" con --quash, quando provo a "spingere sottostrato", inizia a ispezionare tutti i commit su quella sottostruttura dall'inizio del tempo, anche se voglio che spinga solo quelli che eseguono commit che sono dopo che la sottostruttura è stata "aggiunta" di nuovo nel repository del container. – Nishith

1

Ho avuto esattamente lo stesso problema che avevi e l'ho risolto utilizzando essenzialmente l'approccio suggerito da Roger Nolan. Tuttavia, se sei abbastanza sfortunato da trovarti su un file system insensibile alle maiuscole e minuscole come lo ero io, devi anche assicurarti che ogni volta che fai un pull e una spinta, il caso del tuo prefisso rimanga lo stesso.

Quando finisci per confondere il caso per errore, git penserà che hai due sottoalberi mentre solo uno esisterà sul filesystem.

Quindi la soluzione che ho finito con (in caso aiuta nessuno) è:

  1. creare uno script che spingerà il vostro sottostruttura. Chiamalo publish_<your-subtree-name>.
  2. Creare un altro script che tirerà il sottostruttura. Chiamalo update_<your-subtree-name>.
  3. Crea un ramo temporaneo presso il tuo HEAD e prova l'aggiornamento. Se il tuo script è giusto, il tuo ramo temporaneo non si muoverà.
  4. Clona il repository di sottostruttura altrove, aggiungi un commit di test, spingilo e prova a inserirlo nel repository utilizzando lo script di aggiornamento appena scritto.
  5. Se tutto funziona, cancella il ramo temporaneo e ora controlla entrambi gli script sul repository di progetto super.
  6. Quindi, ogni volta che è necessario premere o tirare sottoalberi, utilizzare gli script.

PS> Il parametro --squash è importante, in particolare se rami diversi dei reporsitory estraggono rami diversi della sottostruttura e anche se nel progetto sono presenti più sottostrutture.

Problemi correlati