Tarować folder bez plików .git?

16

Jeśli udostępnię tar folderowi, który jest repozytorium git, czy mogę to zrobić bez dołączania .gitpowiązanych plików? Jeśli nie, jak miałbym to zrobić za pomocą polecenia?

chrisjlee
źródło

Odpowiedzi:

24

Najpierw spójrz git help archive. archiveto polecenie git, które pozwala tworzyć archiwa zawierające tylko pliki śledzone przez git. Prawdopodobnie to, czego szukasz. Jeden przykład wymieniony na końcu strony podręcznika:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz
Stéphane Gimenez
źródło
6
tylko archiwizuje root git repo. Jeśli zastosowano submoduły - ich katalogi będą puste.
Stann
@Stann: Dzięki, od innego użytkownika submodułu
Mark K Cowan,
22

Najprostsza odpowiedź: dodaj --exclude-vcs. Wyklucza to wszystkie katalogi systemu kontroli wersji

Osobiście korzystam

tar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME

więc wszystko, co musisz zrobić, to dodać --exclude-vcsna końcu polecenia.

mtelesha
źródło
1
Wszystkie znane , jak sądzę? ;)
phk
3
Wszystkie opcje muszą być razem przed argumentami na GNU / Linux.
Josh Habdas
2
Jak podano dla GNU / Linuxtar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Michael Irey
1
Wygląda na to, że tar OSX Catalina nie obsługuje tej opcji ...
Fran Marzoa
21

Jeśli chcesz, aby archiwum zawierało pliki śledzone przez git, ale nie samo repozytorium git ani żadnego wygenerowanego lub w inny sposób nieśledzonego pliku, użyjgit archive .

Jeśli chcesz wykluczyć, .gitale dołączyć wszystko inne, w Linuksie, FreeBSD, OSX lub Cygwin, tar ma prostą opcję wykluczenia katalogu:

tar -c --exclude .git -f - foo | gzip >foo.tgz

Z GNU tar (tj. Pod Linuksem lub Cygwin) możesz to skrócić tar czf foo.tgz --exclude .git foo.

Sposób tworzenia archiwów przez POSIX to pax.

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz
Gilles „SO- przestań być zły”
źródło
Czy gitkompiluje się w dowolnym systemie, w którym tarnie jest dostępny? :-)
Stéphane Gimenez,
3
@ StéphaneGimenez Prawdopodobnie nie. Ale kompiluje się w systemach, w których tarnie ma --excludeopcji, takich jak OpenBSD (co wprawdzie duplikuje sopcję pax , ale nie jest to typowe rozszerzenie składni komendy tar).
Gilles 'SO - przestań być zły'
0

Dzięki odpowiedzi na jedno z moich pytań wymyśliłem inne rozwiązanie. Dla zachowania kompletności oto rozwiązanie wykorzystujące find:

find . -path './.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

A jeśli chcesz wykluczyć możliwe .gitfoldery w (pod) + folderze:

find . -path '*/.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Później można również osiągnąć poprzez:

find . -type d -name '.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Całkiem przydatny, jeśli możesz skorzystać z innych technik filtrowania find, np. Daty modyfikacji, uprawnień,…

(Jak są traktowane tak często dobrze uformowane nazwy plików, w przeciwnym razie trzeba użyć NULL bajty jako separatory, które może oznaczać -print0dla findi --nullna tarrazie obsługiwane).

phk
źródło