Estou observando arquivos em busca de alterações usando eventos inotify (por acaso, do Python, chamando a libc).
Para alguns arquivos durante a git clone
, vejo algo estranho: vejo um IN_CREATE
evento e vejo ls
que o arquivo tem conteúdo, no entanto, nunca vejo IN_MODIFY
ou IN_CLOSE_WRITE
. Isso está me causando problemas, pois eu gostaria de responder IN_CLOSE_WRITE
nos arquivos: especificamente, para iniciar um upload do conteúdo do arquivo.
Os arquivos que se comportam estranhamente estão no .git/objects/pack
diretório e terminam em .pack
ou .idx
. Outros arquivos que o git cria têm uma cadeia IN_CREATE
-> IN_MODIFY
-> mais regular IN_CLOSE_WRITE
(não estou observando IN_OPEN
eventos).
Isso está dentro da janela de encaixe no MacOS, mas vi evidências do mesmo na janela de encaixe no Linux em um sistema remoto, portanto, minha suspeita é que o aspecto do MacOS não é relevante. Estou vendo isso se estiver assistindo e git clone
estiver no mesmo contêiner de docker.
Minhas perguntas:
Por que esses eventos estão ausentes nesses arquivos?
O que pode ser feito sobre isso? Especificamente, como posso responder à conclusão das gravações nesses arquivos? Nota: idealmente, gostaria de responder quando a escrita estiver "finalizada" para evitar o upload desnecessário / (incorreto) de textos "inacabados".
Edit: Reading https://developer.ibm.com/tutorials/l-inotify/ parece que o que estou vendo é consistente com
- um arquivo temporário separado, com nome como
tmp_pack_hBV4Alz
, sendo criado, modificado e fechado; - um duro link é criado para este arquivo, com a final
.pack
nome; - o
tmp_pack_hBV4Alz
nome original é excluído.
Eu acho que o meu problema, que é tentar usar o inotify como um gatilho para fazer upload de arquivos, reduz a perceber que o .pack
arquivo é um link físico para outro arquivo e o upload nesse caso?