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