Git suit le contenu des fichiers, pas les noms de fichiers. Ainsi, renommer un fichier sans changer son contenu est facile à détecter pour git. (Git ne suit pas, mais exécute détection ; en utilisant git mv
o git rm
y git add
est effectivement le même).
Lorsqu'un fichier est ajouté au référentiel, le nom du fichier se trouve dans l'objet arbre. Le contenu réel du fichier est ajouté sous la forme d'un objet binaire de grande taille ( blob ) dans le référentiel. Git n'ajoutera pas un autre blob pour les fichiers supplémentaires qui contiennent le même contenu. En fait, Git ne peut pas le faire car le contenu est stocké dans le système de fichiers, les deux premiers caractères du hachage étant le nom du répertoire et le reste étant le nom du fichier qui s'y trouve. Ainsi, pour détecter les renommages, il suffit de comparer les hachages.
Pour détecter les petites modifications d'un fichier renommé, Git utilise certains algorithmes et un seuil limite pour savoir s'il s'agit d'un renommage. Par exemple, regardez le -M
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 des renommages pendant une fusion).
Pour comprendre comment git traite similaire (c'est-à-dire quelles transformations de fichiers sont considérées comme des renommages), explorez les options de configuration et les drapeaux 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 pour trouver les différences dans le texte, et lisez le code source de git.
Les algorithmes sont appliqués uniquement à 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 qui se passe à ce niveau. Bien sûr, plus tard, les objets peuvent être empaquetés où les deltas sont stockés dans les packfiles, mais cela n'est pas lié à la détection des renommages.
0 votes
Voir aussi : stackoverflow.com/questions/13805750/