Несколько раз я встречал утверждение, что если вы переместите одну функцию из одного файла в другой, Git сможет ее отследить. Например, в этой записи говорится: "Линус говорит, что если вы переместите функцию из одного файла в другой, Git расскажет вам историю этой единственной функции при перемещении ".
Но я немного знаком с внутренним дизайном Git и не понимаю, как это возможно. Так что мне интересно ... это правильное утверждение? И если да, то как это возможно?
Насколько я понимаю, Git хранит содержимое каждого файла как Blob, и каждый Blob имеет глобально уникальную идентичность, которая возникает из хэша SHA его содержимого и размера. Затем Git представляет папки как деревья. Любая информация о имени файла принадлежит дереву, а не BLOB-объекту, поэтому переименование файла, например, отображается как изменение в Tree, а не в Blob.
Итак, если у меня есть файл с именем «foo» с 20 функциями в нем и файл с именем «bar» с 5 функциями в нем, и я перемещаю одну из функций из foo в bar (в результате получается 19 и 6 соответственно), как Git может определить, что я переместил эту функцию из одного файла в другой?
Насколько я понимаю, это приведет к появлению двух новых блобов (один для измененного foo и один для измененной панели). Я понимаю, что можно рассчитать разницу, чтобы показать, что функция была перемещена из одного файла в другой. Но я не понимаю, как история этой функции могла быть связана с bar вместо foo (во всяком случае, не автоматически).
Если бы Git действительно заглядывал внутрь отдельных файлов и вычислял blob для каждой функции (что было бы безумно / невозможно, потому что вам нужно было бы знать, как анализировать любой возможный язык), тогда я мог понять, как это могло быть возможно.
Итак ... утверждение верно или нет? И если это правильно, то чего не хватает в моем понимании?