Comment git détecte-t-il des fichiers similaires pour sa détection de changement de nom?

91

Wikipedia explique la détection automatique de changement de nom:

En bref, étant donné un fichier en révision N, un fichier du même nom en révision N − 1 est son ancêtre par défaut. Cependant, lorsqu'il n'y a pas de fichier portant le même nom dans la révision N − 1, Git recherche un fichier qui n'existait que dans la révision N − 1 et qui est très similaire au nouveau fichier.

La détection de changement de nom se résume apparemment à une détection de fichier similaire. Cet algorithme est-il documenté quelque part? Ce serait bien de savoir quels types de transformations sont détectés automatiquement.

Mahemoff
la source

Réponses:

92

Git suit le contenu des fichiers, pas les noms de fichiers. Donc, renommer un fichier sans changer son contenu est facile à détecter pour git. (Git ne suit pas, mais effectue la détection ; utiliser git mvou git rmet git addest en fait identique.)

Lorsqu'un fichier est ajouté au référentiel, le nom de fichier se trouve dans l'objet d'arborescence. Le contenu réel du fichier est ajouté en tant qu'objet binaire volumineux ( blob ) dans le référentiel. Git n'ajoutera pas un autre objet blob pour les fichiers supplémentaires contenant le même contenu. En fait, Git ne le peut pas car le contenu est stocké dans le système de fichiers avec les deux premiers caractères du hachage étant le nom du répertoire et le reste étant le nom du fichier qu'il contient. Donc, pour détecter les changements de noms, il s'agit de comparer les hachages.

Pour détecter de petites modifications dans un fichier renommé, Git utilise certains algorithmes et une limite de seuil pour voir s'il s'agit d'un changement de nom. Par exemple, regardez le -Mdrapeau pour git diff. Il existe également des valeurs de configuration telles que merge.renameLimit(le nombre de fichiers à prendre en compte lors de la détection de changement de nom lors d'une fusion).

Pour comprendre comment git traite les fichiers similaires (c'est-à-dire quelles transformations de fichiers sont considérées comme des renoms), explorez les options de configuration et les indicateurs disponibles, comme mentionné ci-dessus. Vous n'avez pas besoin d'être considéré avec le comment. Pour comprendre comment git accomplit réellement ces tâches, regardez les algorithmes permettant de trouver des différences dans le texte et lisez le code source de git.

Les algorithmes ne sont appliqués qu'à des fins de diff, de fusion et de journalisation - ils n'affectent pas la façon dont git les stocke. Tout petit changement dans le contenu du fichier signifie qu'un nouvel objet est ajouté pour celui-ci. Il n'y a pas de delta ou de diff à ce niveau. Bien sûr, plus tard, les objets peuvent être regroupés là où les deltas sont stockés dans des fichiers de paquets, mais cela n'est pas lié à la détection de changement de nom.

manojlds
la source
57
"Vous n'avez pas besoin d'être considéré avec le comment." - Je pensais que c'était la question?
bain
2

Il existe de nombreux algorithmes qui détectent les similitudes entre les textes, et les systèmes de contrôle de version les utilisent souvent déjà pour stocker uniquement la différence entre deux versions. Des outils comme WinMerge sont suffisamment intelligents pour détecter les différences, même au sein des lignes, donc je ne vois pas de raison pour laquelle ces algorithmes ne seraient pas utilisés pour cette détection de changement de nom.

Voici une discussion sur les algorithmes pour détecter des textes similaires . Certains de ces algorithmes peuvent être optimisés pour les langages naturels, tandis que d'autres fonctionnent mieux pour le code source, mais ils se ressemblent essentiellement.

GolezTrol
la source