Я наблюдаю за изменениями в файлах, используя события inotify (как это происходит из Python, вызывая libc).
Для некоторых файлов во время a git clone
я вижу что-то странное: я вижу IN_CREATE
событие и вижу, ls
что в файле есть контент, однако я никогда не вижу IN_MODIFY
или IN_CLOSE_WRITE
. Это вызывает у меня проблемы, так как я хотел бы ответить IN_CLOSE_WRITE
на файлы: в частности, чтобы начать загрузку содержимого файла.
Файлы, которые ведут себя странно, находятся в .git/objects/pack
каталоге, и они заканчиваются на .pack
или .idx
. Другие файлы, которые создает git, имеют более регулярную цепочку IN_CREATE
-> IN_MODIFY
-> IN_CLOSE_WRITE
(я не наблюдаю за IN_OPEN
событиями).
Это внутри докера на MacOS, но я видел доказательства того же на докере на Linux в удаленной системе, поэтому я подозреваю, что аспект MacOS не имеет значения. Я вижу это, если смотрю и git clone
в том же контейнере докера.
Мои вопросы:
Почему эти события отсутствуют в этих файлах?
Что с этим можно сделать? В частности, как я могу ответить на завершение записи в эти файлы? Примечание: в идеале я хотел бы ответить, когда запись «закончена», чтобы избежать ненужной / (неправильной) загрузки «незаконченной» записи.
Редактировать: чтение https://developer.ibm.com/tutorials/l-inotify/ похоже, что то, что я вижу, соответствует
- отдельный временный файл с именем, как
tmp_pack_hBV4Alz
, создается, изменяется и закрывается; - на этот файл создается жесткая ссылка с окончательным
.pack
именем; - оригинальное
tmp_pack_hBV4Alz
имя удалено.
Я думаю, что моя проблема, которая заключается в попытке использовать inotify в качестве триггера для загрузки файлов, сводится к тому, чтобы заметить, что .pack
файл представляет собой жесткую ссылку на другой файл, и к загрузке в этом случае?