Я наблюдаю за изменениями в файлах, используя события 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файл представляет собой жесткую ссылку на другой файл, и к загрузке в этом случае?