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

Jak usunąć plik .DS_Store z repozytorium Git?

Okładka posta: Jak usunąć plik .DS_Store z repozytorium Git?
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 .

Ten post nie ma jeszcze żadnych dodatków od autora.

Pisujemy demo-grę Drones vs Zombies (Gosu / Ruby)
12 lip 12:17

Pisujemy demo-grę Drones vs Zombies (Gosu / Ruby)

meme code
meme code@memecode
Jak naprawić awarię Windows spowodowaną przez CrowdStrike?
19 lip 13:53

Jak naprawić awarię Windows spowodowaną przez CrowdStrike?

meme code
meme code@memecode
Co oznacza .map(&:name) w Ruby?
28 lip 11:18

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

meme code
meme code@memecode
Jak działa metoda map w Ruby? Przegląd działania metody z przykładami
30 lip 07:33

Jak działa metoda map w Ruby? Przegląd działania metody z przykładami

meme code
meme code@memecode
Co oznacza kropka na początku pliku (.gitignore, .DS_Store, .bashrc itd.)?
2 sie 13:15

Co oznacza kropka na początku pliku (.gitignore, .DS_Store, .bashrc itd.)?

meme code
meme code@memecode
Co to jest .gitignore? Do czego jest potrzebny i jak go używać
2 sie 14:58

Co to jest .gitignore? Do czego jest potrzebny i jak go używać

meme code
meme code@memecode
Co to jest metoda idempotentna?
21 sie 20:57

Co to jest metoda idempotentna?

meme code
meme code@memecode
Czym jest repozytorium?
21 sie 21:25

Czym jest repozytorium?

meme code
meme code@memecode
Co to jest commit w kontekście programowania oraz SCM / Git?
21 sie 21:37

Co to jest commit w kontekście programowania oraz SCM / Git?

meme code
meme code@memecode
Co to jest SCM (Zarządzanie Kontrolą Źródła)?
21 sie 21:46

Co to jest SCM (Zarządzanie Kontrolą Źródła)?

meme code
meme code@memecode
Jaką hierarchię ma DOM (Model Obiektów Dokumentu)?
23 sie 09:22

Jaką hierarchię ma DOM (Model Obiektów Dokumentu)?

meme code
meme code@memecode
Jak działa model sztucznej inteligencji?
15 wrz 16:42

Jak działa model sztucznej inteligencji?

meme code
meme code@memecode