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 clonewidzę coś dziwnego: widzę IN_CREATEzdarzenie i widzę, lsże plik ma treść, jednak nigdy nie widzę IN_MODIFYani IN_CLOSE_WRITE. Powoduje to problemy, ponieważ chciałbym odpowiedzieć IN_CLOSE_WRITEna pliki, a konkretnie zainicjować przesyłanie zawartości pliku.
Pliki, które zachowują się dziwnie, znajdują się w .git/objects/packkatalogu i kończą się na .packlub .idx. Inne pliki, które tworzy git, mają bardziej regularny IN_CREATE-> IN_MODIFY-> IN_CLOSE_WRITEłańcuch (nie szukam IN_OPENwydarzeń).
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 clonesą 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
.packnazwie; - pierwotna
tmp_pack_hBV4Alznazwa 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 .packplik jest twardym linkiem do innego pliku, i przesłanie w tym przypadku?