tag Come unire due rami con diverse gerarchie di directory in git?




git tag stackoverflow (2)

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à).

Mi piacerebbe sbarazzarmi del vecchio ramo e unire le sue 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 avvicinarsi a questa unione?


Prova a impostare merge.renameLimit su qualcosa di alto per questa unione. git prova a rilevare i nomi, ma solo se il numero di file è inferiore a questo limite, poiché richiede tempo di elaborazione O (n ^ 2):

git config merge.renameLimit 999999

allora una volta fatto:

git config --unset merge.renameLimit

Il post sul blog " Confluence, git, rinomina, unisci oh my ... " aggiunge alcune informazioni interessanti che illustrano la answer (upvoted):

Quando si tenta di rilevare i nomi, git distingue tra i nomi esatti e quelli inesatti con:

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

Questa distinzione è importante perché l'algoritmo per la rilevazione dei nomi esatti è lineare e verrà sempre eseguito mentre l'algoritmo per il rilevamento della ridenominazione inesatta è quadratico ( O(n^2) ) e git non tenta di farlo se il numero di file modificati supera una certa soglia (1000 di default).

Se non impostato in modo esplicito, merge.renameLimit imposta i merge.renameLimit predefiniti su 1000 file o utilizza il valore per diff.renameLimit se impostato.
Il diff.renameLimit influenza git diff , git show e git log mentre merge.renameLimit applica solo ai tentativi di unione ( git merge , git cherry-pick ).

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

Per mostrare i nomi, comandi come git show o git log possono essere usati con l'opzione -M che attiva il rilevamento del rinominare.

Linus menziona :

Sì, per il kernel, ho

    [diff]
            renamelimit=0

per disabilitare completamente il limite, perché il limite predefinito è davvero molto basso. 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'uso di molta memoria (e se hai poca memoria, lo swapping significa che va da "abbastanza scattante" a "lento come melassa" - ma non sarà ancora limitato dalla CPU, è semplicemente impaginato come un matto).





git-merge