Oglądam pliki pod kątem zmian za pomocą zdarzeń inotify (jak to się dzieje, z Pythona, wywołującego libc).
W przypadku niektórych plików podczas a git clone
widzę coś dziwnego: widzę IN_CREATE
zdarzenie i widzę, ls
że plik ma treść, jednak nigdy nie widzę IN_MODIFY
ani IN_CLOSE_WRITE
. Powoduje to problemy, ponieważ chciałbym odpowiedzieć IN_CLOSE_WRITE
na pliki, a konkretnie zainicjować przesyłanie zawartości pliku.
Pliki, które zachowują się dziwnie, znajdują się w .git/objects/pack
katalogu i kończą się na .pack
lub .idx
. Inne pliki, które tworzy git, mają bardziej regularny IN_CREATE
-> IN_MODIFY
-> IN_CLOSE_WRITE
łańcuch (nie szukam IN_OPEN
wydarzeń).
Jest to wewnątrz okna dokowanego w systemie MacOS, ale widziałem dowody tego samego w oknie dokowanym w systemie Linux w zdalnym systemie, więc moje podejrzenie, że aspekt MacOS nie jest istotny. Widzę to, jeśli oglądam i git clone
są w tym samym kontenerze dokera.
Moje pytania:
Dlaczego w tych plikach brakuje tych zdarzeń?
Co można z tym zrobić? W szczególności, jak mogę zareagować na zakończenie zapisu do tych plików? Uwaga: idealnie chciałbym odpowiedzieć, gdy pisanie jest „zakończone”, aby uniknąć niepotrzebnego / (niepoprawnego) przesyłania „niedokończonego” pisania.
Edycja: Czytanie https://developer.ibm.com/tutorials/l-inotify/ wygląda na to, że to, co widzę, jest zgodne z
- oddzielny plik tymczasowy o nazwie podobnej
tmp_pack_hBV4Alz
, tworzony, modyfikowany i zamykany; - trudny związek jest tworzony do tego pliku, o ostatecznej
.pack
nazwie; - pierwotna
tmp_pack_hBV4Alz
nazwa zostanie usunięta.
Wydaje mi się, że mój problem polega na tym, że próbuję użyć inotify jako wyzwalacza do przesyłania plików, a następnie sprowadza się do zauważenia, że .pack
plik jest twardym linkiem do innego pliku, i przesłanie w tym przypadku?