← strona głównaProgramowanie (Програмування)

Jak usunąć plik .DS_Store z repozytorium Git?

Jak usunąć plik .DS_Store z repozytorium Git? Ignorujemy nowe pliki .DS_Store i usuwamy już dodane do Gita.

Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
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
Додав 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
Додався .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
Створений .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):
find . -name '.DS_Store' -type f -delete
git rm -r --cached .
git add .
git commit -m "Remove .DS_Store files"
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
Коміт з видаленим .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):
git rm -r --cached .

🔥 Więcej postów

Wszystkie wpisy
Co oznacza .map(&:name) w Ruby?
Programowanie (Програмування)28 lip '24 11:18

Co oznacza .map(&:name) w Ruby?

Co oznacza .map(&:name) w Ruby? Przykłady użycia skrótu wywołania map.

Co to jest metoda idempotentna?
Programowanie (Програмування)21 sie '24 20:57

Co to jest metoda idempotentna?

Czym jest metoda idempotentna? Opis i przykłady metod idempotentnych w programowaniu.

Czym jest repozytorium?
Programowanie (Програмування)21 sie '24 21:25

Czym jest repozytorium?

Czym jest repozytorium? Do czego jest potrzebne i jak działa?

Jak działa model sztucznej inteligencji?
Komputery i technologie (Комп'ютери та технології)15 wrz '24 16:42

Jak działa model sztucznej inteligencji?

Jak działa model sztucznej inteligencji? Główne etapy pracy modelu SI. Problemy i ograniczenia te...