In che modo git rileva file simili, per il rilevamento della ridenominazione?


91

Wikipedia spiega il rilevamento automatico della ridenominazione:

In breve, dato un file nella revisione N, un file con lo stesso nome nella revisione N − 1 è il suo antenato predefinito. Tuttavia, quando non c'è un file con lo stesso nome nella revisione N − 1, Git cerca un file che esisteva solo nella revisione N − 1 ed è molto simile al nuovo file.

Il rilevamento di rinomina si riduce apparentemente a un rilevamento di file simile. Quell'algoritmo è documentato da qualche parte? Sarebbe bello sapere quali tipi di trasformazioni vengono rilevate automaticamente.


Risposte:


92

Git tiene traccia dei contenuti dei file, non dei nomi dei file. Quindi rinominare un file senza modificarne il contenuto è facile da rilevare per git. (Git non tiene traccia, ma esegue il rilevamento ; usando git mvo git rmed git addè effettivamente lo stesso.)

Quando un file viene aggiunto al repository, il nome del file si trova nell'oggetto albero. Il contenuto effettivo del file viene aggiunto come un oggetto binario di grandi dimensioni ( BLOB ) nel repository. Git non aggiungerà un altro BLOB per file aggiuntivi che contengono lo stesso contenuto. In effetti, Git non può poiché il contenuto è memorizzato nel filesystem con i primi due caratteri dell'hash come nome della directory e il resto è il nome del file al suo interno. Quindi per rilevare le ridenominazioni è questione di confrontare gli hash.

Per rilevare piccole modifiche a un file rinominato, Git utilizza determinati algoritmi e un limite di soglia per vedere se si tratta di una ridenominazione. Ad esempio, dai un'occhiata alla -Mbandiera per git diff. Sono disponibili anche valori di configurazione come merge.renameLimit(il numero di file da considerare quando si esegue il rilevamento della ridenominazione durante un'unione).

Per capire come git tratta file simili (cioè quali trasformazioni di file sono considerate come rinominate), esplora le opzioni di configurazione e le flag disponibili, come menzionato sopra. Non devi essere considerato con il come. Per capire come git esegue effettivamente queste attività, guarda gli algoritmi per trovare le differenze nel testo e leggi il codice sorgente di git.

Gli algoritmi vengono applicati solo per scopi di diff, merge e log - non influenzano il modo in cui git li memorizza. Qualsiasi piccola modifica nel contenuto del file significa che viene aggiunto un nuovo oggetto. Non ci sono differenze o differenze a quel livello. Naturalmente, in seguito, gli oggetti potrebbero essere impacchettati dove i delta sono memorizzati nei file di pacchetto, ma ciò non è correlato al rilevamento della ridenominazione.


57
"Non devi essere considerato con il come." - Pensavo fosse quella la domanda?
bagno

2

Esistono molti algoritmi che rilevano somiglianze tra i testi e i sistemi di controllo delle versioni spesso li utilizzano già per memorizzare solo la differenza tra due versioni. Strumenti come WinMerge sono abbastanza intelligenti da rilevare le differenze, anche all'interno delle righe, quindi non vedo un motivo per cui questi algoritmi non vengano utilizzati per questo rilevamento di rinomina.

Ecco una discussione sugli algoritmi per rilevare testi simili . Alcuni di questi algoritmi potrebbero essere ottimizzati per i linguaggi naturali, mentre altri potrebbero funzionare meglio per il codice sorgente, ma in sostanza sono molto simili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.