2013-02-05 13 views
7

Come parte di una domanda che ho proposto in precedenza su finding the best match between two sources, dove uno ha un repository git attivo e l'altro non ha cronologia git, ho scritto a perl script to find the closest git commit.Misurazione della "prossimità" negli alberi di grandi dimensioni

Sono in procinto di riscrivere lo script in modo da non dover indovinare quale ramo utilizzare, ma verrà eseguito e trovare la corrispondenza più simile in tutti i rami, quindi dirvi il miglior commit con il miglior ramo. Sfortunatamente, sto scoprendo che la misurazione che sto usando potrebbe non essere il miglior giudice di "vicinanza".

Attualmente, utilizzo diff -burN -x.git my_git_subtree my_src_subtree | wc -l per determinare quanto sono vicini gli alberi del codice. Questo sembra funzionare più o meno, ma mi imbatto in casi in cui vengono aggiunte o mancanti intere cartelle, che probabilmente esistono o non esistono in un altro ramo.

C'è un modo migliore per determinare quanto sono vicine le sorgenti? Sto immaginando qualcosa che paragona le strutture delle directory, probabilmente anche quante linee sono diverse. Potrebbe essere solo questione di passare parametri diversi a diff, o forse c'è un altro strumento là fuori che fa qualcosa del genere.

+4

Non c'è modo di vincere misurando la "vicinanza" dei programmi. "if (~ x) explode" è di una misura banalmente diversa da "if (x) explode" (un carattere), ma i risultati di questi due programmi sono radicalmente diversi. Tutti obietteranno a qualsiasi misura tu proponi; Ti suggerisco di scegliere un set e vivere con il flack. Quelli che non amano, puoi dare il benvenuto a implementare una risposta migliore. –

risposta

3

Per migliorare la misurazione, perché non provare 'git diff --shortstat'? L'output è simile al seguente:

1 file changed, 1 insertion(+), 2 deletions(-) 

Si può giocare con il modo di dare la priorità file modifiche/inserzioni/cancellazioni, a seconda dei risultati.

Guardando il tuo perl, penso che probabilmente non sarai in grado di formulare ipotesi sull'ordine di "vicinanza" tra i commit - potresti aver bisogno di controllare la forza bruta ogni commit, o almeno renderlo un opzione.

Vorrei anche suggerire che invece di cercare il più vicino, si mantiene una lista ordinata di coppie (commit, "vicinanza") e forse visualizzare i primi e rivederli a mano. Come accennato in seguito, non esiste un punto d'argento per determinare se due serie di codici sono vicine o non semplicemente guardando il numero di modifiche. Detto questo, il numero di modifiche può sicuramente aiutarti a restringere la lista da rivedere ...

AGGIORNAMENTO: Devo anche menzionare che un altro vantaggio dell'utilizzo di git diff è che non è necessario eseguire un hard ripristina per ogni commit. Semplicemente simula la directory .git/dal tuo albero sconosciuto (il primo con una storia git), e usa git reset [--mixed] e aggiornerà il puntatore head corrente, ma lascerà la tua sorgente invariata (ovviamente dovrai fare il backup dello sconosciuto albero dei sorgenti prima di usare questo metodo).

Problemi correlati