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.