Tar folder tanpa file .git?

16

Jika saya tar folder yang merupakan repositori git, dapatkah saya melakukannya tanpa menyertakan .gitfile terkait? Jika tidak, bagaimana cara saya melakukannya melalui perintah?

chrisjlee
sumber

Jawaban:

23

Lihatlah dulu git help archive. archiveadalah perintah git yang memungkinkan untuk membuat arsip yang hanya berisi file yang dilacak git. Mungkin apa yang Anda cari. Satu contoh tercantum di akhir halaman manual:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz
Stéphane Gimenez
sumber
6
ini hanya arsip root git repo. Jika submodula digunakan - direktori mereka akan kosong.
Stann
@Stann: Terima kasih, dari pengguna submodule lain
Mark K Cowan
22

Jawaban paling sederhana: Tambah --exclude-vcs

--exclude-vcs

Ini mengecualikan semua direktori sistem kontrol versi

Secara pribadi saya gunakan

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

jadi yang perlu Anda lakukan adalah menambahkan --exclude-vcs di akhir perintah.

mtelesha
sumber
Semua yang dikenal , saya kira? ;)
phk
3
Semua opsi harus bersama sebelum argumen pada GNU / Linux.
Josh Habdas
2
Sebagaimana dinyatakan untuk GNU / Linuxtar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Michael Irey
20

Jika Anda ingin arsip menyertakan file yang dilacak oleh git, tetapi bukan repositori git itu sendiri atau file apa pun yang dihasilkan atau tidak dilacak, maka gunakangit archive .

Jika Anda secara spesifik ingin mengecualikan .gittetapi memasukkan yang lainnya, di Linux atau FreeBSD atau OSX atau Cygwin, tar memiliki opsi sederhana untuk mengecualikan direktori:

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

Dengan GNU tar (yaitu di Linux atau Cygwin), Anda dapat mempersingkat ini menjadi tar czf foo.tgz --exclude .git foo.

Cara POSIX membuat arsip adalah pax.

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Apakah gitmengkompilasi pada sistem mana pun di mana tartidak tersedia? :-)
Stéphane Gimenez
1
@ StéphaneGimenez Mungkin tidak. Tapi itu mengkompilasi pada sistem di mana tartidak memiliki --excludeopsi, seperti OpenBSD (yang diakui menduplikasi sopsi pax , tapi itu bukan ekstensi sintaks perintah tar yang umum).
Gilles 'SANGAT berhenti menjadi jahat'
0

Berkat jawaban yang saya dapatkan pada salah satu pertanyaan saya, saya menemukan solusi lain. Jadi demi kelengkapan, berikut adalah solusi yang memanfaatkan find:

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

Dan jika Anda ingin mengecualikan kemungkinan .gitfolder di dalam (sub) + folder:

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

Belakangan juga dapat dicapai melalui:

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

Cukup praktis jika Anda dapat menggunakan teknik penyaringan lainnya find, misalnya tanggal modifikasi, izin, ...

(Sebagai nama file yang sering well-formed diasumsikan, jika tidak, anda perlu menggunakan nol byte sebagai pemisah yang dapat berarti -print0untuk finddan --nulluntuk tarjika didukung.)

phk
sumber