Как git узнает, изменился ли tarball?

Если tar-архив (файл.tgz) отслеживается в репозитории Git, как Git узнает, изменился ли он между коммитами?

Я пытаюсь скопировать это поведение / функциональность, чтобы определить, есть ли изменения между двумя разными тарболами.

Опять же, что я пытаюсь сделать? Я хочу создать скрипт, который может различать тарболы, без использования Git

1 ответ

Решение

Git знает, изменился ли tar-файл, так же, как он определяет, изменились ли другие файлы: он сравнивает содержимое файла. Это может быть так же наивно, как сравнивать их побайтно или сначала вычислять хэш файла, а затем сравнивать хэши. Поскольку Git хранит все известные файлы со своими хэшами, это можно использовать вместо дорогостоящего побайтового сравнения.

Чтобы использовать эту функциональность, вы можете просто использовать сам Git для сравнения любых двух файлов в вашей файловой системе:

git diff --no-index file1.tgz file2.tgz

Или, если у вас нет Git, вы можете использовать простой diff команда вместо

Другой вариант - вручную вычислить контрольные суммы двух файлов и сравнить контрольные суммы. Если контрольные суммы отличаются, то файлы гарантированно будут разными. Если контрольные суммы идентичны, очень вероятно, что содержимое файла также идентично, но все еще существует вероятность коллизий хешей, поэтому, чтобы быть уверенным, вам придется сравнивать файлы побайтно.

Простой способ вычислить и сравнить контрольные суммы двух файлов был бы следующим:

test "$(sha1sum <file1)" = "$(sha1sum <file2)"

Обратите внимание на перенаправление ввода-вывода, поэтому выходные данные одинаковы, даже если файлы имеют разные имена.

Конечно, вы можете использовать любой другой алгоритм хеширования, такой как sha256sum

Другие вопросы по тегам