.gitignore wszystkie pliki .DS_Store w każdym folderze i podfolderze

559

Dodałem .DS_Store do pliku .gitignore, ale wygląda na to, że ignoruje on tylko .DS_Store w katalogu głównym, a nie w każdym folderze i podfolderze.

Jak to naprawić?

vickyqiu
źródło
Jak dokładnie dodałeś go do .gitignore? Powinien działać we wszystkich katalogach (działa dla mnie).
Thilo,
To też działa dla mnie. Próbowałem także, gdy jest na końcu pliku, jeśli musisz mieć znak nowej linii (specyficzny dla platformy), ale to nie zmieniło tego, że katalogi .DS_Store w dowolnej części hierarchii były nadal ignorowane.
enorl76,
Pytanie, jakie rozumiem, brzmiało: jak łatwo zignorować wszystkie wystąpienia .DS_Store we wszystkich podkatalogach bez ręcznego wykonywania tego w każdym podkatalogu. Miałem ten sam problem. Poniższa odpowiedź pokazuje, jak ją rozwiązać (ostatnie 2 akapity).
petrsyn

Odpowiedzi:

645

Myślę, że masz problem z tym, że w niektórych wcześniejszych zmianach przypadkowo dodałeś pliki .DS_Store do repozytorium. Oczywiście, gdy plik zostanie wyśledzony w repozytorium, będzie nadal śledzony, nawet jeśli pasuje do wpisu w odpowiednim pliku .gitignore.

Musisz ręcznie usunąć pliki .DS_Store, które zostały dodane do repozytorium. Możesz użyć git rm --cached .DS_Store. Po usunięciu git powinien go zignorować. Należy trzeba następującą linię w pliku .gitignore korzeniowego tylko: .DS_Store. Nie zapomnij okresu!

git rm --cached .DS_Storeusuwa tylko .DS_Storez bieżącego katalogu. Możesz użyć, find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatchaby usunąć wszystko .DS_Storesz repozytorium.

Wskazówka: ponieważ prawdopodobnie nigdy nie chcesz dołączać plików .DS_Store, stwórz globalną regułę. Najpierw utwórz gdzieś globalny plik .gitignore, np echo .DS_Store >> ~/.gitignore_global. Teraz powiedz git go używać dla wszystkich repozytoriów: git config --global core.excludesfile ~/.gitignore_global.

Ta strona pomogła mi odpowiedzieć na twoje pytanie: https://help.github.com/articles/ignoring-files

Edward Newell
źródło
41
Ostatnie 2 akapity odpowiadają na to pytanie. Dzięki.
petrsyn
70
´´git rm --cached .DS_Store´´ usuwa tylko jeden .DS_Store z bieżącego katalogu. Użyj „Znajdź”. -nazwa .DS_Store -print0 | xargs -0 git rm --ignore-unmatch´´, aby usunąć wszystkie .DS_Stores z repozytorium
auco
4
Przydatna
14
Zły pomysł na użycie globalnej reguły IMO: Próba utrzymania globalnej konfiguracji dla wielu użytkowników / komputerów nigdy nie działa - chcesz reguł rządzących twoim repozytorium w samym repozytorium. Zgadzam się z tym
Yarin
15
Nie zgadzam się z tobą (Chociaż głosowałem za twoim komentarzem, ponieważ uważam, że jest to wnikliwe.) Jeśli prowadzimy działalność globalną, każdy użytkownik systemu Mac musi to zrobić, ale tylko raz. Jeśli zajmujemy się całym repozytorium, musimy to zrobić dla każdego repozytorium. Nie wiem o tobie, ale ciągle robię nowe repo. Robiąc to globalnie, problem rozwiązuje się raz na zawsze.
Edward Newell,
354

Dodaj **/.DS_Storedo .gitignorepodkatalogu


Jeśli .DS_Storezostało już popełnione:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

Aby zignorować je we wszystkich repozytoriach: (czasami o nazwie ._.DS_Store)

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global
ronald8192
źródło
Nadal przesyłane do mojego repozytorium?
Freddy Sidauruk
@FreddySidauruk użyje git rm --cached your_filepierwszy
ronald8192
@FreddySidauruk Powinno być find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch, z: stackoverflow.com/questions/18393498/…
ronald8192
1
Wydaje się, że dodanie -fjest konieczne, jeśli masz otwarte pliki w folderach ponownego udostępnienia:find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Mehmet Kaplan
158

Jeśli .DS_Store nigdy nie został dodany do Twojego repozytorium git, po prostu dodaj go do pliku .gitignore.

Jeśli go nie masz, utwórz plik o nazwie

.gitignore

W katalogu głównym aplikacji i po prostu napisz

**/.DS_Store

W tym. To nigdy nie pozwoli, aby plik .DS_Store zakradł się do twojego gita.

Ale jeśli już tam jest, napisz w swoim terminalu:

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

następnie zatwierdzić i wcisnąć zmiany, aby usunąć plik .DS_Store ze zdalnego repozytorium:

git commit -m "Remove .DS_Store from everywhere"

git push origin master

A teraz dodaj .DS_Store do pliku .gitignore, a następnie ponownie zatwierdź i wypuść z 2 ostatnimi fragmentami kodu (git commit ..., git push ...)

drjorgepolanco
źródło
3
Dlaczego podwójna gwiazdka? Co to znaczy?
MilanG
1
@MilanG jest słowem kluczowym, które w zasadzie oznacza „szukaj w tym katalogu i we wszystkich podkatalogach”.
lachie_h
1
Nie jestem pewien, czy to doskonałe wyjaśnienie tego, co oznacza podwójna gwiazdka. To jest symbol wieloznaczny. Może *lub w **zależności od tego, co chcesz osiągnąć. Jest to sposób na powiedzenie powłoce, jak poruszać się po katalogach. Ta odpowiedź stackoverflow wyjaśnia to w pełni stackoverflow.com/a/28199633/4092170
El'Magnifico
** nigdy nie będzie pasowało do ukrytych (./) katalogów: facelessuser.github.io/wcmatch/glob
Jonathan
to faktycznie działa ... powinno być oznaczone jako odebrane
ichimaru,
85

Twój plik .gitignore powinien wyglądać następująco:

# Ignore Mac DS_Store files
.DS_Store

Dopóki nie dodasz ukośnika, jest on dopasowywany do nazwy pliku we wszystkich katalogach. ( stąd )

Yarin
źródło
wciąż jest aktualizowany do repozytorium
Freddy Sidauruk
@FreddySidauruk, a następnie musisz biecgit rm --cached path/to/file/here
Sgnl
23

Krok 1, usuń wszystkie *.DS_storepliki. Można biegać

git rm -f *.DS_Store

ale pamiętaj, że rm -fmoże to być trochę niebezpieczne, jeśli masz literówkę! Krok drugi: dodaj

*.DS_Store
.DS_Store

do .gitignore. To zadziałało dla mnie!

kości podróżne
źródło
13

Dodaj *.DS_Storedo pliku .gitignore. To działa dla mnie idealnie

Jakub
źródło
11

Możesz także dodać --cachedflagę do odpowiedzi auco, aby zachować lokalne pliki .DS_store, jak wspomniał Edward Newell w swojej oryginalnej odpowiedzi. Zmodyfikowane polecenie wygląda tak: find . -name .DS_Store -print0 | xargs -0 git rm --cached --ignore-unmatch..cheers i dzięki!

Andrew Wilhelm
źródło
5

Krok: 1) Usuń istniejące pliki za pomocą tego polecenia

odnaleźć . -nazwa .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

Krok: 2) Dodaj .DS_Store do pliku .gitignore

Krok: 3) Zatwierdź zmiany w .gitignore git add .gitignore git commit -m "usunięto .DS_Store"

Visnu
źródło
3
  1. $ git rm ./*.DS_Store - usuń wszystkie .DS_Store z git
  2. $ echo \.DS_Store >> .gitignore - w przyszłości zignoruj ​​.DS_Store

zatwierdzaj i pchaj

mate.gwozdz
źródło