Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej
W tym wpisie omówimy, jak dodać .DS_Store do pliku .gitignore oraz usuniemy już dodane pliki z naszego repozytorium. Ale najpierw musimy zrozumieć, czym jest .DS_Store, do czego jest potrzebny, dlaczego trafia do Gita i jak go usunąć.
Czym jest .DS_Store?
.DS_Store (Desktop Services Store) — to ukryty plik systemowy, stworzony przez macOS do przechowywania informacji o wyświetlaniu folderów w Finderze, takich jak pozycje ikon, rozmiary okien, kolory tła itp.
Jeśli otwierasz folder w Finderze i zmieniasz pozycję ikony - Finder zapisze informacje o pozycji w .DS_Store. Domyślnie ten plik jest ukryty, ale można go zobaczyć w terminalu. Nawet jeśli w Finderze włączysz pokazywanie ukrytych plików - .DS_Store będzie się przed tobą ukrywać. Więcej informacji na temat ukrytych plików znajdziesz w poprzednim wpisie - Co oznacza kropka na początku pliku (.gitignore, .DS_Store, .bashrc itp.)?
Dlaczego .DS_Store trafia do Gita?
Kiedy pracujesz nad projektem na macOS i używasz Gita do kontroli wersji, pliki .DS_Store mogą przypadkowo trafić do twojego repozytorium razem z innymi plikami. Dzieje się tak, ponieważ domyślnie Git nie ignoruje tych plików i mogą one zostać przypadkowo dodane do indeksu. Rozważmy przykład. Używam GitHub Desktop do pracy z Gitem i klonuję nowe repozytorium na swoją lokalną maszynę. Pierwsze, co robię, to tworzę plik test.txt:
Додав test.txt
Zauważ, że Git widzi zmiany tylko w nowym pliku (stworzyłem go za pomocą VSCode i zapisałem w folderze tego repo). To dlatego, że obecnie Finder nie ma żadnych niestandardowych ustawień dla tego pliku i folderu ogólnie. Otwórzmy folder w Finderze, zmieńmy pozycję pliku (ikony) w trybie kafelkowym i zobaczmy, że nowy .DS_Store został dodany do listy zmian w Gicie:
Додався .DS_Store
Wyobraź sobie, że zrobiłeś commit, dodając .DS_Store do repozytorium projektu, nad którym pracuje wiele osób. Po pierwsze, nikt nie potrzebuje konfiguracji twojego Findera w repozytorium projektu. Po drugie, te pliki zaśmiecają historię commitów i repozytorium w ogóle.
Jak zapobiec dodawaniu .DS_Store do repozytorium?
To proste - zignoruj go. Mam na myśli - dodaj go do pliku .gitignore.
Po prostu dodaj ten wiersz:
.DS_Store
Jeśli plik .gitignore jeszcze nie istnieje - stwórz go (za pomocą edytora kodu lub przez terminal).
Za pomocą terminala można stworzyć ten plik przy pomocy touch:
touch .gitignore
A tekst '.DS_Store' do pliku .gitignore można dodać za pomocą echo:
echo .DS_Store >> .gitignore
Створений .gitignore
Po tym kroku zazwyczaj ludzie próbują stworzyć nowy folder, dodać do niego nowy plik i zmienić pozycję pliku w Finderze, aby sprawdzić, czy .DS_Store rzeczywiście jest ignorowane.
I najprawdopodobniej nowe .DS_Store będą się pojawiać i nie będą ignorowane. Ale dlaczego?
Dlaczego .gitignore nie działa i nie ignoruje .DS_Store?
Uruchommy następujące komendy w terminalu, aby uzyskać pożądany wynik (ignorowanie .DS_Store):
Po tym otrzymamy nowy commit z usuniętymi plikami .DS_Store, a nowe będą ignorowane i nie dodawane do indeksu plików.
Коміт з видаленим .DS_Store
Ale przyjrzyjmy się, co uruchomiliśmy w terminalu:
Najpierw usuwasz wszystkie pliki .DS_Store z systemu plików za pomocą komendy find ... -delete.
Następnie usuwasz wszystkie pliki z indeksu Gita (nie z systemu plików) za pomocą komendy git rm --cached.
Dodajesz wszystkie pliki do indeksu ponownie, aby upewnić się, że pliki .DS_Store nie trafią do nowego commitu, ponieważ teraz są ignorowane przez .gitignore.
Tworzysz nowy commit z wiadomością, która opisuje wprowadzone zmiany.
W rzeczywistości wszystko sprowadza się do cache. Więc go wyczyściliśmy. Oczywiście można uruchomić czyszczenie cache'u selektywnie dla jednego pliku:
git rm --cached `.DS_Store`
Ale bardziej odpowiada mi rekurencyjne czyszczenie całego cache'u (to bardziej uniwersalna metoda):