Git Clone: ​​Sadece dosyalar, lütfen?


141

Ben bir GIT repo klonlamak istiyorum ve bir .gitdizin ile sona . Başka bir deyişle sadece dosyaları istiyorum. Bunu yapmanın bir yolu var mı?

git clone --no-checkoutne istediğimin tam tersini yaptı (bana sadece .gitdizin verdi ).

Ben için bunu çalışıyorum uzak şudur yani repo, yerel değil tek bir kopya değil "nin ‘(svn ihracat gibi ‘’) git ihracat Nasıl yapmak’ çözüm bir türlü olmuyor olsa bile (" aynı).



@Greg Hewgill Bunu uzak bir repodan yapmaya çalışıyorum. Yine de bu sorunun benzersiz olup olmadığından emin değilim.
Dan Rosenstark

1
Bu daha yeni bir soru olsa da, bunun kontrol
edilmeye

1
Güncelleme yanıtımı görün : git archiveŞimdi (4. Çeyrek 2017) daha kesin ve boş klasörler içermiyor.
VonC

1
Rica ederim. Görünüşe göre, yorumunuz işaretlendi ve kaldırıldı ... chat.stackoverflow.com/transcript/134259?m=39402889#39402889
VonC

Yanıtlar:


75

Aradığın şeye en yakın olan git komutu git archive. Git kullanan yedekleme projesine
bakın : bir arşivde tüm dosyaları içerecektir ( komut dosyasını kullanıyorsanız alt modüller dahil )git-archive-all

Daha sonra bu arşivi her yerde kullanabilirsiniz, size sadece dosyaları geri verir, .gitdizin yok .

git archive --remote=<repository URL> | tar -t

Yalnızca ilk düzeyden klasörlere ve dosyalara ihtiyacınız varsa:

git archive --remote=<repository URL> | tar -t --exclude="*/*"

Uzak bir deponun yalnızca birinci düzey klasörlerini listelemek için:

git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"

Not: GitHub için çalışmaz (desteklenmez)

Bu nedenle klonlamanız (klon adımını hızlandırmak için sığ) ve ardından yerel olarak arşivlemeniz gerekir :

git clone --depth=1 git@github.com:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar

Başka bir seçenek de (aşağıda belirtildiği gibi) sığ bir klon yapmak, ancak .git klasörünü başka bir yerde bulmak olacaktır.

git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo

Repo klasörü olmadan sadece dosyayı içerir .git.

Not: komutungit --git-dir bir seçeneğidir , değil .gitgit clone


Git 2.14.X / 2.15 (Q4 2017) ile güncelleme: boş klasörler eklemekten kaçınacaktır .

" git archive", özellikle pathspec ile kullanıldığında Git'in hiçbir zaman yapmamasına rağmen çıktısında boş bir dizin sakladı.
Bu düzeltildi.

Bakınız René Scharfe (``) tarafından 4318094 (12 Eyl 2017) taahhüdü . Önerilen: Jeff King ( ) . (Göre Birleştirilmiş - Junio Cı Hamano - içinde 62b1cb7 tamamlama 2017 25 Eki)
peff
gitster

archive: arşivlere boş dizin eklemeyin

Git boş dizinleri takip etmese de, git archivebazılarını arşivlere koymak için kandırılabilir.
Bu, nesne veritabanı tarafından desteklense de, dizinde temsil edilemez ve bu nedenle vahşi ortamda gerçekleşmesi olası değildir.

Boş dizinler git tarafından desteklenmediği için arşivlere de yazılmamalıdır.
Boş bir dizin gerçekten gerekliyse, içine boş bir .gitignoredosya yerleştirilerek izlenebilir ve arşivlenebilir .


4
Bu benim için çalıştı. Bir şey daha eklerdim. .Git klasörünü hiç umursamıyorsanız, bu komutu kullanırım:git --git-dir=/dev/null clone --depth=1 /url/to/repo
HumanSky

Bu, .git klasörünü kaldırmaz
aliasav

@VonC Denedim: git --git-dir = / dev / null klon - depth = 1 / url / to / repo
aliasav

1
Koşuyorum git archive --remote=https://github.com/pornel/dssim.git @ | tar -tanladım tar: This does not look like a tar archive. GitHub ile çalışmaz mı? Ayrıca, ne anlama @geliyor?
André Werlang

2
@ AndréWerlang 7 yıl sonra ... Bundan emin değilim @: Kaldırdım. Ayrıca GitHub bir uzaktan kumandayı desteklemez git archive: Bir alternatif önermek için cevabı düzenledim.
VonC


42

yalnızca son birkaç düzeltmeyi almak için sığ bir klon oluşturabilirsiniz:

 git clone --depth 1 git://url

daha sonra .git dizinini silin veya git archiveağacınızı dışa aktarmak için kullanın .


Klon yineleyerek güncelleştirdiğimde bu hatayı nasıl önleyeceğim: "fatal: hedef yol 'XYZ' zaten var ve boş bir dizin değil."
Sohail Si

1
@SohailSi: yeni bir konuma klonlayın veya eski dizini kaldırın. Yerel kopyanızı güncellemek istiyorsanız, muhtemelen yeni düzeltmeleri getirmeniz daha iyi olacaktır.
knittl

3

Neden bir klonlama yapmıyorsunuz ve daha sonra .gitçıplak çalışan bir kopyanız olması için dizini silmiyorsunuz ?

Düzenleme: Ya da aslında neden klon kullanıyorsunuz? Bir git repo istediğinizi ancak dizinsiz olduğunu söylemek biraz kafa karıştırıcı .git. Sadece ağacın bazı durumlarının bir kopyasını istediğinizi söylüyorsanız cp -R, neden git klonu yerine kabukta yapmıyorsunuz ve daha sonra silin .git.


Bunun için teşekkürler. Dosyalar git deposundadır. Mac kullanıcılarını bir GIT repo haline gelmeden tek satırda repo kopyasını almaya yönlendirmeyi umuyordum.
Dan Rosenstark

Eğer kullanamazlarsa, insanların repodan doğrudan kod almasına izin vermemelisiniz (yani Git deposuna sahip değilsiniz).
alternatif

@Amoss İnsanlar sürekli en son kodu almamak için bir tarball serbest bırakmak?
alternatif

1
@mathepic: ve bir tarball'ı serbest bırakmak için depodan temiz bir çalışma kopyası elde etmenin bir yoluna ihtiyacınız var - ki bu tam olarak sorulan soru.
Andrew

1
Aşağıdaki cevabı okumak ve biraz googling yapmak başka bir soruya yol açtı: stackoverflow.com/questions/160608/… git archive --remote kullanımına bir göz atarsanız, o zaman tam olarak ne (ve orijinal poster) ) arıyoruz. Düzenleme: Jon'un aşağıdan cevapladığı şey budur.
Andrew

2

Sadece kaynak kodun bir kopyasını istiyormuşsunuz gibi geliyor. Öyleyse neden sadece dizini kopyalayıp .git dizinini kopyadan çıkarmıyorsunuz?


5
Sorduğum şey bu: git ile nasıl yapılır ... Zaten aldığım cevaplardan bunu yapmanın yerleşik bir yolu olmadığını zaten söyleyebilirim. Yine de teşekkürler!
Dan Rosenstark

2

git checkout -f

Repoyu çalışma ağacından ayırarak bunu yapmanın başka bir yolu var.

Bu yöntem, git-less git dosyalarını düzenli olarak güncellemeniz gerektiğinde kullanışlıdır. Örneğin, kaynak dosyaları kontrol etmem ve bir yapay yapı oluşturmam gerektiğinde bunu kullanıyorum, daha sonra yapay nesneyi sadece bir sunucuya dağıtım için farklı bir repoya kopyaladım ve bunu istediğimde kaynak kodunu bir sunucuya iterken de kullanıyorum kaynak kodunu kontrol edin ve www dizinine yerleştirin.

Biri çalışma dosyaları için bir tane olmak üzere iki klasör yapacağız:

mkdir workingfiles
mkdir barerepo.git

bir çıplak git repo başlat:

cd barerepo.git
git --bare init 

Sonra bir alma sonrası kanca oluşturun:

touch hooks/post-receive
chmod ug+x hooks/post-receive

En sevdiğiniz düzenleyicide alma sonrası düzenleme:

GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]

Bunu uzaktan kumanda olarak ekle:

git remote add myserver ssh://user@host:/path/to/barerepo.git

Şimdi bu çıplak repoya her bastığınızda, çalışma ağacını kontrol edecektir /workingfiles/. Ancak /workingfiles/kendisi sürüm kontrolü altında değildir; çalışan git statusiçinde /workingfiles/hata verecektir fatal: Not a git repository (or any parent up to mount point /data). Sadece düz dosyalar.

Diğer çözümlerin aksine rm -r .gitkomut gerekli değildir, bu yüzden /workingfiles/başka bir git repo ise , diğer repo'nun git dosyalarını kaldırmak için kullanılan komut hakkında endişelenmenize gerek yoktur.


1
Kabul. Burada çıplak bir repo üzerinde bir alım sonrası kanca mümkündür. +1
VonC

sadece dosyaları almaya çalışıyorsanız bir sürü iş
Rainb

Sadece dosyaları düzenli olarak istiyorsanız çok fazla iş değil.
Slam
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.