Я переглядаю файли для змін, використовуючи події 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, але я бачив докази того ж на docker в Linux у віддаленій системі, тому моє підозра в аспекті MacOS не має значення. Я бачу це, якщо дивлюся і git clone
знаходяться в одному докерному контейнері.
Мої запитання:
Чому ці події відсутні у цих файлах?
Що з цим можна зробити? Зокрема, як я можу відповісти на завершення запису до цих файлів? Примітка: в ідеалі я хотів би відповісти, коли написання "закінчено", щоб уникнути зайвого / (неправильного) завантаження "незакінченого" написання.
Редагувати: Читання https://developer.ibm.com/tutorials/l-inotify/ виглядає так, що те, що я бачу, відповідає
- окремий тимчасовий файл із ім'ям
tmp_pack_hBV4Alz
, яке створюється, змінюється та закривається; - важко буде створена посилання на цей файл, з остаточним
.pack
назвою; - оригінальне
tmp_pack_hBV4Alz
ім’я видалено.
Я думаю, що моя проблема, яка намагається використовувати inotify як тригер для завантаження файлів, потім зводиться до того, що помічає, що .pack
файл є твердим посиланням на інший файл, і завантаження в цьому випадку?