.Git dosyaları olmayan bir klasörü tar?


16

Git deposu olan bir klasörü tar alırsam, .gitilgili dosyaları eklemeden yapabilir miyim ? Değilse, bunu bir komutla nasıl yapabilirim?

Yanıtlar:


24

Önce bir göz atın git help archive. archiveyalnızca git izlenen dosyaları içeren arşivler oluşturmanıza izin veren bir git komutudur. Muhtemelen aradığın şey. Kılavuz sayfasının sonunda listelenen bir örnek:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

6
bu sadece root git repo arşivler. Alt modüller kullanılmışsa - dizinleri boş olacaktır.
— Stann

@Stann: Başka bir alt modül kullanıcısından teşekkürler
— Mark K Cowan

22

En basit cevap: Ekle --exclude-vcs. Bu, tüm sürüm kontrol sistemi dizinlerini içermez

Şahsen kullanıyorum

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

tek yapmanız gereken --exclude-vcskomutun sonuna '' eklemektir .


1
Bilinen tüm olanlar, sanırım? ;)
— phk

3
GNU / Linux argümanlarından önce tüm seçeneklerin birlikte olması gerekir.
— Josh Habdas

2
GNU / Linux için belirtildiği gibitar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
— Michael Irey

1
OSX Catalina'nın katranı bu seçeneği desteklemiyor gibi görünüyor ...
— Fran Marzoa

21

Arşivin git tarafından izlenen dosyaları içermesini, ancak git deposunun kendisini veya oluşturulmuş veya izlenmemiş herhangi bir dosyayı içermemesini istiyorsanız, kullanıngit archive .

Özellikle hariç tutmak, .gitancak Linux veya FreeBSD veya OSX veya Cygwin altında her şeyi dahil etmek istiyorsanız , tar bir dizini hariç tutmak için basit bir seçeneğe sahiptir:

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

GNU katranı ile (yani Linux veya Cygwin altında) bunu kısaltabilirsiniz. tar czf foo.tgz --exclude .git foo .

Arşiv oluşturmanın POSIX yolu pax.

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz

Mevcut olmayan githerhangi bir sistemde derlemeler var mı tar? :-)
— Stéphane Gimenez

3
@ StéphaneGimenez Muhtemelen hayır. Ancak OpenBSD gibi bir seçeneğin tarolmadığı sistemlerde --excludederlenir (bu, pax'ın sseçeneğini kuşkusuz çoğaltır , ancak bu ortak bir tar komutu sözdizimi uzantısı değildir).
— Gilles 'SO- kötü olmayı bırak'

0

Sorularımdan birine aldığım bir cevap sayesinde başka bir çözüm buldum. Tamlık uğruna, işte aşağıdakilerden faydalanan bir çözüm find:

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

Ve .git(sub) + klasörün içindeki olası klasörleri hariç tutmak istiyorsanız :

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

İkincisi ayrıca şu yollarla da elde edilebilir:

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

findDeğişiklik tarihi, izinler vb. Gibi diğer filtreleme tekniklerinden faydalanabiliyorsanız oldukça kullanışlıdır .

(Sık sık iyi biçimli dosya adları varsayılır gibi, aksi takdirde boş anlamına gelebilir ayırıcı olarak bayt kullanımına ihtiyaç -print0için findve --nulliçin tardestekleniyorsa.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.