Jak mogę usunąć pliki .DS_Store z repozytorium Git?

Odpowiedzi:

2426

Usuń istniejące pliki z repozytorium:

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

Dodaj linię

.DS_Store

do pliku .gitignore, który można znaleźć na najwyższym poziomie repozytorium (lub utworzyć, jeśli jeszcze go nie ma). Możesz to łatwo zrobić za pomocą tego polecenia w głównym katalogu

echo .DS_Store >> .gitignore

Następnie

git add .gitignore
git commit -m '.DS_Store banished!'
benzado
źródło
13
To naprawdę trywialne, ale użycie -execuruchomi się git-rmraz dla każdego pliku .DS_Store, podczas gdy xargsumieści wszystkie ścieżki w jednym wierszu poleceń. Przede wszystkim wolę, xargsponieważ nie muszę się martwić ucieczką przed wieloma postaciami specjalnymi.
benzado
8
To powinno używać .git / info / exclude, a nie .gitignore. Zobacz stackoverflow.com/questions/1753070/..., aby uzyskać wyjaśnienie różnicy między nimi.
Andrew Grimm,
106
@Andrew: Nie zgadzam się. Nigdy nie przydałby się plik .DS_Store do zaewidencjonowania, dlatego jest bardziej sensowny jako ustawienie dla wszystkich użytkowników w całym repozytorium, niż coś, o czym każdy użytkownik Maca musi pamiętać na swoim własnym komputerze.
benzado
51
Czy dodawanie .DS_Storedo .gitignorepracy rekurencyjnie? Czy to również zignoruje some/level/of/folders/.DS_Store?
Charlie Schliesser
70
@CharlieS Tak, jeśli wzorzec nie zawiera ukośnika, jest dopasowywany do nazwy pliku we wszystkich katalogach.
benzado
239

Łącząc odpowiedzi benzado i webmat, aktualizując git rm, nie zawodząc na plikach, które nie znajdują się w repozytorium, i czyniąc go ogólnie możliwym do wklejenia dla każdego użytkownika:

# remove any existing files from the repo, skipping over ones not in repo
find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
# specify a global exclusion list
git config --global core.excludesfile ~/.gitignore
# adding .DS_Store to that list
echo .DS_Store >> ~/.gitignore
Turadg
źródło
2
Odkryłem, że podczas korzystania z repozytorium git w moim katalogu domowym (AKA repozytorium „dotfiles”), posiadanie ~/.gitignorejako mojego globalnego pliku wykluczeń jest uciążliwe. Istnieją pliki, które chcę wykluczyć z mojego katalogu domowego, których nie chcę ignorować globalnie. Używam ~/.gitexcludeszamiast tego za pomocą tej samej dyrektywy:core.excludesfile
AL X
155

Najlepszym rozwiązaniem tego problemu jest globalne ignorowanie tych plików ze wszystkich repozytoriów git w systemie. Można to zrobić, tworząc globalny plik gitignore, taki jak:

vi ~/.gitignore_global

Dodawanie reguł ignorowania plików takich jak:

# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so

# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

# Logs and databases #
######################
*.log
*.sql
*.sqlite

# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

Teraz dodaj ten plik do swojej globalnej konfiguracji git:

git config --global core.excludesfile ~/.gitignore_global

Edytować:

Usunięto ikony, ponieważ mogą być konieczne zatwierdzenie ich jako zasobów aplikacji.

Nerw
źródło
Możesz także dodać powyższe reguły w .gitignore swojego repozytorium. Pozwoliłoby to utrzymać te pliki na poziomie repozytorium, jeśli w projekcie jest wielu współpracowników. Jednak w takich przypadkach .gitignore powinien obsługiwać określone pliki każdego systemu operacyjnego itp., Jeśli różni programiści używają innego systemu operacyjnego. Podobnie jak zasady dla Linuksa, OSX itp.
Nerve
Polecam, aby każdy programista zajął się plikami specyficznymi dla systemu operacyjnego we własnym pliku .global_ignore, w ten sposób projekt .gitignore jest specyficzny dla projektu.
mcfedr
należy uruchomić: git dodać .gitignore_global, aby inni programiści mieli również ten plik w swoim lokalnym środowisku?
stackdave
58

W niektórych sytuacjach możesz też chcieć zignorować niektóre pliki globalnie. Dla mnie .DS_Store jest jednym z nich. Oto jak:

git config --global core.excludesfile /Users/mat/.gitignore

(Lub dowolny wybrany plik)

Następnie edytuj plik tak jak .gitignore repozytorium. Zauważ, że myślę, że musisz użyć absolutnej ścieżki.

webmat
źródło
26

Jeśli nie możesz usunąć plików, ponieważ mają one wprowadzone zmiany, użyj:

git rm --cached -f *.DS_Store
Reggie Pinkham
źródło
19

Otwórz terminal i wpisz „cd <ProjectPath>”

  1. Usuń istniejące pliki: find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

  2. nano .gitignore

  3. Dodaj .DS_Store

  4. wpisz „ctrl + x”

  5. Wpisz „y”

  6. Wprowadź, aby zapisać plik

  7. git add .gitignore

  8. git commit -m '.DS_Store removed.'

Karthick Vadivel
źródło
nano .gitignoretworzy plik, jeśli nie jest obecny, to polecenie należy wykonać z folderu głównego projektu
Saif
17

Najczęściej głosowana odpowiedź jest niesamowita, ale pomagając nowicjuszom takim jak ja, oto jak utworzyć plik .gitignore, edytować go, zapisać, usunąć pliki, które mogłeś już dodać do git, a następnie przesłać plik do Github.

Utwórz plik .gitignore

Aby utworzyć plik .gitignore, możesz po prostu touchplik, który tworzy pusty plik o określonej nazwie. Chcemy utworzyć plik o nazwie .gitignore, abyśmy mogli użyć polecenia:

touch .gitignore

Zignoruj ​​pliki

Teraz musisz dodać wiersz, który mówi git, aby zignorował pliki DS Store do twojego .gitignore. Aby to zrobić, możesz użyć edytora nano.

nano .gitignore

Nano jest fajny, ponieważ zawiera instrukcje, jak się z niego wydostać. ( Ctrl- Oaby zapisać, Ctrl- Xaby wyjść)

Skopiuj i wklej niektóre pomysły z tej listy Github, która zawiera listę popularnych plików do zignorowania. Najważniejsze, aby odpowiedzieć na to pytanie, to:

# OS generated files #
######################
.DS_Store
.DS_Store?

# To komentarze i pomogą ci uporządkować plik w miarę jego wzrostu.

W tym artykule Github znajdują się także ogólne pomysły i wytyczne.

Usuń pliki już dodane do git

Na koniec musisz usunąć pliki DS Store z katalogu.

Użyj tego wspaniałego polecenia z najlepiej głosowanej odpowiedzi. Spowoduje to przejrzenie wszystkich folderów w katalogu i usunięcie tych plików z git.

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

Wciśnij .gitignore w górę do Github

Ostatnim krokiem jest zatwierdzenie pliku .gitignore.

git status

git add .gitignore

git commit -m '.DS_Store banished!'

Joshua Dance
źródło
3
polecenie dotykowe na twoich krokach nie jest konieczne ... nano utworzy plik dla ciebie.
Corey Goldberg
1
Znalazłem własną odpowiedź 2 lata później i wykorzystałem ją. Dobra robota obok mnie. :)
Joshua Dance
Działa idealnie !! Dzięki
iUser
15

Musiałem zmienić git-rm na git rm w powyższym celu, aby działał:

find . -depth -name '.DS_Store' -exec git rm --cached '{}' \; -print
David Kahn
źródło
10

usuń je za pomocą git-rm, a następnie dodaj .DS_Store, .gitignoreaby zatrzymać dodawanie. Możesz także użyć blueharvest, aby powstrzymać ich od stworzenia wszystkich razem

Nathan
źródło
9

Jeśli chcesz usunąć pliki DS_Store do każdego folderu i podfolderu:


W przypadku już zatwierdzonego sklepu DS_Store:

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

Zignoruj ​​je przez:

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

źródło
8

Poniższe działało dla mnie najlepiej. Obsługiwane niepasujące pliki oraz pliki z lokalnymi modyfikacjami. Dla porównania było to w systemie Mac 10.7 z systemem git 1.7.4.4.

Znajdź i usuń:

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

Globalnie ignoruję również .DS_Store we wszystkich repozytoriach, ustawiając globalny plik core.excludes.

Najpierw utwórz plik (jeśli jeszcze nie istnieje):

touch ~/.gitignore

Następnie dodaj następujący wiersz i zapisz:

.DS_Store

Teraz skonfiguruj git, aby globalnie szanował plik:

git config --global core.excludesfile ~/.gitignore
jordantbro
źródło
8

Użyj tego polecenia, aby usunąć istniejące pliki:

find . -name '*.DS_Store' -type f -delete

Następnie dodaj .DS_Storedo.gitignore

Słoneczny
źródło
6

Odkryłem, że następujący wiersz z snipplr najlepiej czyści wszystko .DS_Store, w tym ten, który ma lokalne modyfikacje.

find . -depth -name '.DS_Store' -exec git-rm --cached '{}' \; -print

--cachedopcja, zachowuje lokalny, .DS_Storeponieważ i tak zostanie odtworzony.

I tak jak wspomniano powyżej, dodaj .DS_Storedo pliku .gitignore w katalogu głównym swojego projektu. Wtedy nie będzie już w twoim zasięgu (repozytoriów).

manat
źródło
5

Jestem trochę spóźniony na przyjęcie, ale mam dobrą odpowiedź. Aby usunąć pliki .DS_Store, użyj następujących poleceń z okna terminala, ale zachowaj ostrożność, usuwając pliki za pomocą polecenia „znajdź”. Używanie określonej nazwy z opcją -name jest jednym z bezpieczniejszych sposobów jej użycia:

cd directory/above/affected/workareas
find . -name .DS_Store -delete

Możesz pominąć opcję „-delete”, jeśli chcesz po prostu wymienić je przed i po. To zapewni cię, że ich nie ma.

W odniesieniu do porady ~ / .gitignore_global: bądź ostrożny tutaj. Chcesz umieścić ten ładny plik w .gitignore na najwyższym poziomie każdego workarea i zatwierdzić go, aby każdy, kto klonuje twoje repo, skorzystałby z jego użycia.

zeozod
źródło
4

To zadziała:

find . -name "*.DS_Store" -type f -exec git-rm {} \;

Usuwa wszystkie pliki, których nazwy kończą się .DS_Store, w tym ._.DS_Store.

John Topley
źródło
3
Gwiazdka nie powinna tam być.
Arystoteles Pagaltzis
3
gwiazdka powinna tam być, ponieważ znalazłem pliki .DS_Store i ._. DS_Store w moim systemie Mac.
MutantMahesh
3
@MutantMahesh. W takim przypadku potrzebujesz "*.DS_Store", aby gwiazdka była przekazywana do findpowłoki zamiast rozszerzana przez nią.
TRiG
4

Z jakiegoś powodu żadne z powyższych nie działało na moim komputerze Mac.

Moje rozwiązanie pochodzi z terminalu:

rm .DS_Store

Następnie uruchom następujące polecenie:

git pull origin master
Niezwyciężony
źródło
3
$ git commit -m "filter-branch --index-filter 'git rm --cached --ignore-unmatch .DS_Store"
$ git push origin master --force
J Z.
źródło
3

Podczas inicjowania repozytorium pomiń zawierające go polecenie git

-u

i nie powinno to stanowić problemu.

dav1dhunt
źródło
1
Co jeśli ktoś inny utworzył repozytorium, a OP tylko z nim synchronizuje?
jww
3

To zadziałało dla mnie, połączenie dwóch odpowiedzi z góry:

  • $ git rm --cached -f * .DS_Store
  • $ git commit -m "filter-branch --index-filter 'git rm --cached --ignore-unmatch .DS_Store"
  • $ git push origin master --force
JLunceford
źródło
3

Usuń zignorowane pliki:

(.DS_Store)

$ find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
Cubiczx
źródło
2

Istnieje kilka rozwiązań tego problemu. Aby uniknąć tworzenia plików .DS_Store, nie używaj wyszukiwarki OS X do przeglądania folderów. Alternatywnym sposobem przeglądania folderów jest użycie wiersza poleceń UNIX. Aby usunąć pliki .DS_Store, można użyć produktu innej firmy o nazwie DS_Store Terminator. Aby usunąć pliki .DS_Store z całego systemu, można użyć polecenia powłoki UNIX. Uruchom terminal z aplikacji: Narzędzia W wierszu poleceń powłoki UNIX wpisz następującą komendę UNIX: sudo find / -name ".DS_Store" -depth -exec rm {} \; Po wyświetleniu monitu o podanie hasła wprowadź hasło administratora Mac OS X.

To polecenie służy do wyszukiwania i usuwania wszystkich wystąpień pliku .DS_Store, zaczynając od katalogu głównego (/) systemu plików na całym komputerze. Aby skonfigurować to polecenie, aby było uruchamiane jako zaplanowane zadanie, wykonaj następujące czynności: Uruchom terminal z aplikacji: Narzędzia W wierszu poleceń powłoki UNIX wprowadź następujące polecenie UNIX:

sudo crontab -e Gdy pojawi się monit o hasło, wprowadź hasło administratora Mac OS X. W edytorze vi naciśnij raz literę I na klawiaturze i wprowadź następujące informacje:

15 1 * * * root find / -name ".DS_Store" -depth -exec rm {} \;

Nazywa się to wpisem crontab, który ma następujący format:

Minute Hour DayOfMonth Month DayOfWeek Polecenie użytkownika.

Wpis crontab oznacza, że ​​polecenie będzie wykonywane automatycznie przez system codziennie o 01:15 przez konto o nazwie root.

Polecenie zaczyna się od find aż do. Jeśli system nie działa, polecenie to nie zostanie wykonane.

Aby zapisać wpis, naciśnij raz klawisz Esc, a następnie jednocześnie naciśnij Shift + z + z.

Uwaga: informacje w kroku 4 dotyczą wyłącznie edytora vi.

Vinny
źródło
2

dodaj to do pliku .gitignore

#Ignore folder mac
.DS_Store

zapisz to i dokonaj zatwierdzenia

git add -A
git commit -m "ignore .DS_Store"

a teraz ignorujecie to dla wszystkich swoich zobowiązań

Ezequiel García
źródło
2

utwórz .gitignoreplik za pomocą poleceniatouch .gitignore

i dodaj w nim następujące wiersze

.DS_Store

zapisz .gitignoreplik, a następnie wepchnij go do repozytorium git.

2rahulsk
źródło
2

Najlepszym sposobem, aby pozbyć się tego pliku na zawsze i nigdy więcej nie martwić się o to

utwórz globalny plik .gitignore:

echo .DS_Store >> ~ / .gitignore_global

Poinformuj gita, że ​​chcesz użyć tego pliku dla wszystkich swoich repozytoriów:

git config --global core.excludesfile ~ / .gitignore_global I to wszystko! .DS_Store jest na twojej drodze.

Kasem007
źródło
1

Nie trzeba usuwać .DS_STORElokalnie

Po prostu dodaj go do .gitignorepliku

Plik .gitignore jest tylko plikiem tekstowym, który informuje Git, które pliki lub foldery mają zignorować w projekcie.

Polecenia

  • nano .gitignore
  • Napisz .DS_StoreNastępnie kliknijCTRL+X > y > Hit Return
  • git status Aby zobaczyć ostatnie zmiany
  • git add .gitignore
  • git commit -m 'YOUR COMMIT MESSAGE'
  • git push origin master
Wael Assaf
źródło