2012-03-19 15 views
15

Abbiamo cercato di ottenere git-subtree lavorando su un progetto (con git versione 1.7.9.4) e abbiamo incontrato un po 'di complicazioni. Qualcun altro precedente aggiunto la sottostruttura con questo comando qualche mese fa:git-subtree pull complicazioni

git subtree add --prefix=foo [email protected]:foo.git master 

modifiche sostanziali Ora ci sono stati a foo e vorremmo di unire a questi cambiamenti, idealmente schiacciandoli nella Nessuno dei file sono stati. modificato da quando sono stati importati.

Ho provato tre cose per provare e unire le modifiche.

Primo:

git subtree pull --squash -P foo [email protected]:foo.git master 

che getta l'eccezione: Can't squash-merge: 'foo' was never added.

Secondo:

git subtree pull -P foo [email protected]:foo.git master 

questo funziona (o quasi), ma ha il problema di tirare in tutti i commit e ha conflitti con i file che sono stati modificati.

Infine, ho provato questo:

git pull --squash -s subtree [email protected]:foo.git master 

Questo mi dà il risultato desiderato, con l'uscita Automatic merge went well; stopped before committing as requested e tutti i file che mostra come modificato (con il contenuto corretto).

Idealmente mi piacerebbe continuare a utilizzare la prima versione git-subtree e ottenere un output vicino all'ultima versione. Se dovessimo utilizzare l'ultima versione in modo coerente, lo faremo, ma sono un po 'confuso sul motivo per cui l'ultimo non produce conflitti di fusione mentre quello intermedio lo fa.

Qualsiasi aiuto è apprezzato.

risposta

6

Ho avuto lo stesso problema e nel mio caso sembra essere dovuto al fatto che il commit della sottostruttura iniziale è stato unito al master branch.

Guardando attraverso la fonte sotto-albero ho trovato questo: https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L224

Sembra sottostruttura greps il registro git per git-subtree-dir: foo ma non trova un adeguato commit. Prova con git log --grep="git-subtree-dir: foo/*\$" e, se c'è qualcosa di strano con quel commit, come se si trattasse di un merge commit, questo potrebbe essere il problema.

Solo tirare senza schiacciare ha funzionato per me, a parte i fastidiosi conflitti di fusione. L'ho fatto in un ramo temporaneo che poi ho aggiunto a git merge --squash in un'altra filiale per evitare una cronologia di messer. Potrebbe anche essere stato rifondato, naturalmente.

+1

Ho avuto lo stesso problema che è risultato essere causato da una mancanza di una sottocartella nell'opzione prefisso quando provo a tirare. Aggiungendo questo come commento dal momento che il messaggio di errore non fornisce alcuna indicazione di questo errore e la risoluzione dei problemi mi ha portato qui. –

+0

Grazie, questo è utile. Ho avuto un problema correlato in cui ho spostato la sottodirectory dopo aver aggiunto la sottostruttura al suo interno, il che sembra far saltare questa partita –

1

Ho riscontrato lo stesso errore Can't squash-merge: 'foo' was never added. con sourcetree 1.7.0 ogni volta che eseguo un pull su una sottostruttura. Tuttavia, credo che il mio caso sia diverso perché sto usando le sottodirectory.

SourceTree fa qualcosa come segue:
git -c diff.mnemonicprefix=false -c core.quotepath=false subtree pull -P dir1\subdir1 --squash remote-repo master

E ovviamente, se dovessimo provare di nuovo a Git Bash (Git versione 2.6.1.windows.1), sarebbe:
git subtree pull -P "dir1\subdir1" --squash remote-repo master

Tuttavia ciò non è riuscito. Quanto segue non è riuscito, anche se la sintassi del comando va bene:
git subtree pull -P dir1/subdir1 --squash remote-repo master

La soluzione che ho trovato per farlo funzionare è quello di utilizzare Git Bash con il seguente comando:
git subtree pull -P "dir1/subdir" --squash remote-repo master

Credo che ci sia ancora un po ' lavoro da fare per il motore di elaborazione da riga di comando di Git.