2012-11-13 18 views
5

Voglio ottenere i cambiamenti tra due date tag, il comando è:Perché git log --cherry-pick è così lento?

git log `Tag1...Tag2 --cherry-pick --no-merges --right-only 

ma è molto lento.

I parametri di test rispettivamente uno per uno. SOLO quando con --cherry-pick, git log è molto lento.

Perché? Qualcuno potrebbe aiutarmi là fuori?

risposta

1

--cherry-Pick
omettere qualsiasi commit che introduce la stessa modifica come un altro commit sul "dall'altra parte" quando il set di commit sono limitati con differenza simmetrica.

Ad esempio, se si hanno due rami, A e B, un modo usuale per elencare tutti i commit su un solo lato di loro è con --left-destra (vedere l'esempio di seguito nella descrizione del - opzione sinistra-destra). Tuttavia, mostra i commit che sono stati selezionati dall'altra diramazione (ad esempio, "3a b" può essere selezionato dal ramo A). Con questa opzione, tali coppie di commit sono escluse dall'output.

Deve confrontare tutti i commit alla ricerca di somiglianze - questa operazione sarà molto lenta rispetto a non dover fare alcun confronto.

+0

Grazie per la risposta, che è di destra. Vedo questa pagina man. tuttavia, come è stato detto, stiamo pianificando di omettere le modifiche che appaiono su altro ramo. Abbiamo altri modi invece di questo? –

+0

Se si usa l'unione invece di cherry-pick, è possibile farlo senza tutto il sovraccarico. – Michael

+0

sì, lo so, ma il codice problema di base non è il nostro lavoro, abbiamo appena recuperiamo i cambiamenti per analizzare la qualità di alcuni dei componenti. non possiamo controllare i comportamenti degli sviluppatori sw. –

0

Sto usando

git log tag1 --not tag2 

che mi dà tutti i commit su tag1 non su tag2. funziona bene anche per rami e tag.

-1

La raccolta delle ciliegie potrebbe non essere così veloce, poiché probabilmente sta rilevando i nomi dei nomi come parte della fusione che può essere costosa, specialmente quando si sta selezionando qualcosa che è molto lontano da HEAD.

Può essere che il vostro config Git ha gc.auto = 0 (git config --get gc.auto), quindi doppio controllo se è abilitato, o semplicemente eseguire:

git gc 

al fine di pulizia dei file non necessari e ottimizzare il repository locale.

Si può anche provare a impostare la variabile merge.renamelimit config per qualcosa di più piccolo (ad esempio 1, dal momento che i mezzi 0 senza limite). Se questo non aiuta, prova a profilare il tuo git (ad esempio usando strace o perf record git cherry-pick ...) e trova il collo di bottiglia.

See: cherry-pick is slow

per Merge-ricorsiva, ci sarebbe sempre voglia di calcolare la coppia-saggio rinomina tra ogni lato e l'antenato. In questo modo, la differenza rispetto alla destinazione scelta da sarà sempre un'operazione O (n. Di modifiche tra origine e destinazione) costosa.

Senza la rinomina, è possibile fare meglio sull'effettiva unione con una camminata dell'albero a tre vie . Ad esempio, si vede che un sottoalbero si trova nell'albero A negli alberi-e ancestor, ma nell'albero B in theirs.In modo da non avere a scendere ulteriormente, e può solo dire "prendere loro" (beh, avete scendere theirs per ottenere i valori). Ma mi aspetto che diventa più complicata con le interazioni con l'indice (e non è probabilmente vale la pena spendere molto sforzo sulla causa del problema rename, comunque).

-Peff

Problemi correlati