Jak skompresować folder, ale wykluczyć podfolder .git

194

Próbuję utworzyć plik zip z folderu i chciałbym wykluczyć .gitpodfolder z wynikowego pliku zip.

Poszedłem do folderu nadrzędnego tego, który chcę spakować ( zwanego bitvolution ) i wykonuję :

zip -r bitvolution.zip bitvolution -x ".git"

Ale to nie wyklucza .gitpodfolderu.

Próbowałem różnych kombinacji, -x .git*, -x \.git/*, -x .git/\*, -x \.git/\*. Próbowałem również użyć pełnej ścieżki do argumentu wykluczenia ... ale po prostu nie dotarłem.

Tomek
źródło

Odpowiedzi:

232

Prawidłowe wyrażenie to -x *.git*, więc pełne polecenie powinno być:

zip -r bitvolution.zip bitvolution -x *.git*

Wyjaśnienie od http://selfsolved.com/problems/zip-command-exclude-svn-director :

Prawidłowa inkantacja to

zip -9 -r --exclude=*.svn*  foo.zip [directory-to-compress]

Możesz także dodać znak „a”,
--exclude=*.DS_Store*aby wykluczyć irytujące pliki metadanych w katalogu Mac OS X.

Zwróć uwagę, że przekazane wyrażenie --excludeużywa całej oryginalnej ścieżki katalogu względnego jako oryginalnego ciągu, z którym ma się zgadzać. Więc .svn/*sam nie działa; znak wieloznaczny z przodu zapewnia, że ​​pasuje do .svnkatalogów w dowolnym miejscu w drzewie katalogów.

Izajasza
źródło
20
Musiałem zawinąć glob w cytaty lub uciec z zip --exclude '*.git*' -r directory.zip directoryzip --exclude \*.git\* -r directory.zip directory
gwiazd za
6
Jeśli martwisz się utratą innych plików o nazwie coś. Nic innego, możesz także użyć --exclude /.git*.
Erin Zadzwoń
4
w ZSH musiałem dodać ukośnik odwrotny:-x \*.git\*
DmitrySandalov
2
Moja preferowana alternatywa dla odwrotnych ukośników i cytatów w zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien
Jak używać go ze smołą? Nie działa z poleceniem tar.
RN Kushwaha,
123

Jeśli próbujesz skompresować projekt przechowywany w Git, użyj git archivepolecenia. Z katalogu źródłowego:

git archive -o bitvolution.zip HEAD

Możesz użyć dowolnego zatwierdzenia lub identyfikatora tagu zamiast HEADzarchiwizować projekt w pewnym momencie.

Jeśli chcesz dodać prefiks (np. Folder najwyższego poziomu) do każdego pliku:

git archive -o bitvolution.zip --prefix=bitvolution/ HEAD

Możesz także dostosować poziom kompresji między 0 (bez kompresji) i 9 (maksymalna kompresja) włącznie, na przykład

git archive -o bitvolution.zip -9 HEAD

Inne opcje można znaleźć na stronie pomocy ( git help archive).

Blair
źródło
25
Nie tylko nie obejmie to folderu git, ale również wszystko, co znajduje się w pliku gitignore, zostanie również wykluczone. Proszę pana o opinię.
JoeMoe1984,
1
Właśnie to chciałem zrobić!
Bjarte
Spóźniam się na przyjęcie, ale to mnie absolutnie rozwaliło. Świetna odpowiedź!
Tom
zastanawiam się, dlaczego nie jest to najlepsza odpowiedź
nabtron
dla mnie był to najlepszy TIL dzisiaj ...
Shawn Cicoria
27

Dodałem ukośnik odwrotny:

zip -r bitvolution.zip bitvolution -x \*.git\*

strona podręcznika o odwrotnym ukośniku:

Ukośnik odwrotny unika zastępowania nazwy pliku powłoki, dzięki czemu dopasowywanie nazw jest wykonywane przez zip na wszystkich poziomach katalogu.

Priit Tamboom
źródło
przygotowując gwiazdki dla mnie z ukośnikami na Ubuntu 14.04, aby wykluczyć katalogi
Dimitry K
6

Zakładając, że masz zainstalowany git na maszynie, którą robisz, możesz również użyć samego git do utworzenia swojego archiwum.

git archive --format=zip HEAD -o bitvolution.zip
Tatu Lahtela
źródło
2

Jeśli używasz zsh, polecenie powinno wyglądać następująco:

zip -r target_name.zip source_dir -x '/*.git/*'

Jeśli używasz: zip -r target_name.zip source_dir -x /*.git/*. bez „regex”, zsh przetworzy przed uruchomieniem zip. Otrzymasz komunikat o błędzie:

zsh: no matches found: /*.git/*
g10guang
źródło
Dzięki! Właśnie to działało dla mnie przy użyciu Bash na Ubuntu w systemie Windows.
Adriano Monecchi,
Nie rozumiałem, jak działa ten wzór, ale pracowałem dla mnie w Zsh.
insign