2011-01-18 13 views
46

Ho iniziato a utilizzare Maven con un progetto di applicazione Web per modificare la gerarchia delle directory. Ho creato una nuova filiale per l'integrazione di Maven. Ora ho due rami uno con la vecchia gerarchia di directory e uno con la gerarchia di directory maven. Entrambe le filiali hanno nuovi commit (bugfix e nuove funzionalità).Come unire due rami con diverse gerarchie di directory in git?

Vorrei sbarazzarmi del vecchio ramo e unire le modifiche al ramo Maven. Git merge offre innumerevoli conflitti che sembra impossibile da risolvere. Credo che questo sia dovuto al fatto che i percorsi dei file sono cambiati.

Qual è il modo migliore per affrontare questa unione?

+9

Solo così gli altri lettori lo sanno: il tipico messaggio di errore per questi problemi è "troppi file che saltano il rilevamento del rename inesatto". –

risposta

115

Provare a impostare merge.renameLimit su qualcosa di alto per questa unione. git tenta di rilevare rinomina, ma solo se il numero di file è al di sotto di questo limite, in quanto richiede O (n^2) Tempo di elaborazione:

git config merge.renameLimit 999999 

poi quando fatto:

git config --unset merge.renameLimit 
+4

Nota dopo aver aumentato renameLimit, ho dovuto eseguire "git merge --abort" in modo che potessi riprovare. Altrimenti, questo ha fatto il trucco. – leontx

17

Il blog post "Confluence, git, rename, merge oh my…", aggiunge alcune interessanti informazioni che illustra Robie s' answer (upvoted):

Quando si cerca di rilevare rinomina git distingue tra esatti e inesatti rinomina con:

  • il primo essendo una ridenominazione senza modificare il contenuto del file e
  • quest'ultimo una ridenominazione che potrebbe includere modifiche al contenuto del file (ad esempio ridenominazione/spostamento di una classe Java).

Questa distinzione è importante perché l'algoritmo per la rilevazione rinomina esatta è lineare e sarà sempre eseguito mentre l'algoritmo per la rilevazione rinomina inesatta è quadratica (O(n^2)) e git non tenta di fare questo se il numero di file è cambiato supera una certa soglia (1000 di default).

Se non impostato in modo esplicito, merge.renameLimit imposta automaticamente a 1000 file o utilizza il valore per diff.renameLimit se impostato.
Il diff.renameLimit affetti git diff, git show e git log mentre merge.renameLimit vale per unire tentativi (git merge, git cherry-pick) soltanto.

È una buona idea cambiare merge.renameLimit anziché cambiare il diff.renameLimit in modo che git non tenti di trovare rinomina durante le operazioni comuni come guardare l'output git diff.

Per visualizzare i nomi, è possibile utilizzare comandi come git show o git log con l'opzione -M attivata.

Linus mentions:

Sì, per il kernel, ho

[diff] 
      renamelimit=0 

per disabilitare il limite del tutto, perché il limite di default è davvero molto bassa. Git è abbastanza bravo nel rilevamento dei nomi.

Tuttavia, il motivo per il basso valore predefinito non è perché non è abbastanza scattante - è perché può finire con l'utilizzo di molta memoria (e se hai poca memoria, lo scambio significherà che va da " abbastanza scattante "a" lento come melassa "- ma non sarà ancora limitato dalla CPU, è semplicemente impaginato come un matto).

Problemi correlati