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.

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.


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).


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.


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

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/*

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.