Soru “Git export” (“svn export” gibi) yapmak ister misiniz?


Bir ağacın bir kopyasını oluşturan iyi bir "git dışa aktarma" çözümü olup olmadığını merak ediyorum .git depo dizini. Bildiğim en az üç yöntem var:

  1. git clone onu kaldırarak .git depo dizini.
  2. git checkout-index Bu işleve değinir, ancak "İstenilen ağacı sadece indekste oku ..." ile başlıyor, ki nasıl yapılacağından emin değilim.
  3. git-export esas olarak bir üçüncü parti betiğidir git clone sonra geçici bir yere rsync --exclude='.git' son varış yerine.

Bu çözümlerin hiçbiri beni tatmin edici bulmuyor. En yakın olanı svn export seçenek 1 olabilir, çünkü her ikisi de önce hedef dizinin boş olmasını gerektirir. Ama seçenek 2, daha iyi görünüyor, bir ağacın indekse okunmasının ne anlama geldiğini anlayabiliyorum.


2165
2017-10-02 02:21


Menşei


@rnrTom: Bkz Somov'un cevabı. (tar arşivinde "sıkıştırılmış" bir şey yoktur). - etarion
@mrTom git archive --format zip --output "output.zip" master -0 size sıkıştırılmamış bir arşiv verecek (-0 sıkıştırılmamış için bayrağı). git-scm.com/docs/git-archive.
Ben mRTom ile hemfikirim ve arşivin sıkıştırılmış veya sıkıştırılmamış olup olmadığını düşünmüyorum ana sorun. SVN ile yapabilirim export doğrudan uzak depodan 250 kB alt dizin (revizyonlar hariç, aksi halde 200 MB boyutunda olabilir) - ve ağa yalnızca 250 kB (veya daha fazla) indirme aktarımı için basacağım. İle git, archive sunucuda etkinleştirilmelidir (bu yüzden deneyemem) - clone --depth 1 sunucudan hala 25 MB bir repo almak olabilir, nerede .git alt klasör tek başına 15MB alır. Bu nedenle, hala cevap "hayır" diyorum. - sdaau
mrTom cevap aslında EVET OP'nin cevabına bakın - komut git checkout-index - nocache
İşte güzel ve basit bir yol: git archive -o latest.zip HEAD - Evgeni Sergeev


Cevaplar:


Muhtemelen bunu başarmanın en basit yolu şudur: git archive. Gerçekten sadece genişletilmiş ağaçlara ihtiyacınız varsa, bunun gibi bir şey yapabilirsiniz.

git archive master | tar -x -C /somewhere/else

Git bir şey 'ihracat' ihtiyacım çoğu zaman, ben her durumda sıkıştırılmış bir arşiv istiyorum, bu yüzden böyle bir şey yaparım.

git archive master | bzip2 >source-tree.tar.bz2

ZIP arşivi:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive Daha fazla detay için oldukça esnektir.


Arşivin .git dizinini içermemesine rağmen, bunun, .gitignore, .gitattributes, vb. Gibi diğer gizli özel dosyaları içereceğini unutmayın. Arşivde istemiyorsanız, .gitattributes dosyasında export-ignore özelliğini kullanın ve arşivinizi yapmadan önce bunu işleyin. Daha fazla oku...


Not: Dizini dışa aktarmak istiyorsanız, komut

git checkout-index -a -f --prefix=/destination/path/

(Görmek Greg'in cevabı daha fazla ayrıntı için)


2198
2017-10-02 18:13



ZIP arşivi: git archive --format zip --output /full/path master - Stream
Arşivin .git dizinini içermediğini, ancak .gitignore, .gitattributes, vb. Gibi gizli diğer belirli dosyaları içerdiğini unutmayın. Bu nedenle, bunları istemiyorsanız, export-ignore özelliğini kullandığınızdan emin olun. .gitattributes dosyasını arşivleyin ve bunu arşivlemeden önce yapın. Görmek feeding.cloud.geek.nz/2010/02/... - mj1531
Akımların notunu takip etmek için: '--prefix = birşey /' dizgisini, fermuarın içine yerleştirilecek dizin ismini kontrol etmek için komuta ekleyebilirsiniz. Örneğin, kullanırsanız git archive --format zip --output /path/to/file.zip --prefix=newdir/ master çıktı 'file.zip' olarak adlandırılacak, ancak paketi açtığınızda üst düzey dizin 'newdir' olacaktır. (--Prefix özniteliğini atlarsanız, üst düzey dir "dosya" olur.) - Alan W. Smith
En kolay yol: git archive -o latest.zip HEAD Mevcut daldaki en son taahhütlerin içeriğini içeren bir Zip arşivi oluşturur. Çıkış formatının çıktı dosyasının uzantısı ile sonuçlandığına dikkat edin. - nacho4d
Git altmodules desteklemiyor :( - umpirsky


2 seçeneğinin ne olduğunu öğrendim. Bir havuzdan şunları yapabilirsiniz:

git checkout-index -a -f --prefix=/destination/path/

Yolun sonundaki eğik çizgi önemlidir, aksi takdirde dosyaların bir 'yol' öneki ile / hedefte olmasıyla sonuçlanır.

Normal bir durumda dizin, deponun içeriğini içerdiğinden, "istenen ağacı indeks içine okumak" için özel bir şey yoktur. O zaten orada.

-a Dizindeki tüm dosyaları işaretlemek için bayrak gerekiyor (bu durumda bu bayrağı çıkarmanın ne anlama geldiğinden emin değilim, çünkü istediğimi yapmıyor). -f Bayrak, bu komutun normalde yapmadığı çıktıdaki mevcut dosyaların üzerine yazarak zorlar.

Bu, aradığım "git dışa aktarma" türü gibi görünüyor.


301
2017-10-02 03:03



... ve SONRAKİ SÜRÜŞÜ UNUTMAYIN, ya da istenen etkiye sahip olmayacaksınız;) - conny
git add komut dizindeki içeriği değiştirir, böylece ne olursa olsun git status "işlenecek" olarak gösterilir farklar HEAD ve indeks içeriği arasında. - Greg Hewgill
@conny: Yorumunuzu okuyun, bunu unutun ve bir iz bırakmadan önce komutu çalıştırın. bahşiş: conny'nin tavsiyesine uyun. - Znarkus
Conny'nin tavsiyesi için +1. Ayrıca, '~ / dest /' yaratmaya çalışmayın, çünkü bu, gerçekten istediğiniz şeyi değil, çalışma dizininizde '~' adlı bir dizin oluşturur. Zihni rm -rf ~ yazdığınızda ne olacağını tahmin edin - Kyle Heironimus
@KyleHeironimus - '~ / dest / `kullanımıyla ilgili uyarınız, önek yolunuzun etrafında tilde genişletme işleminin yapılmadığını bildiren tırnak işaretleri kullandığınız için geçerlidir. Bir dir ~ (değil '~' !) çalışma direktörünüzde oluşturulacaktır. Özel bir şey yok git checkout-index bu konuda da aynı: mkdir '~/dest' (bunu yapma!). Alıntılama gerektiren dosya adlarından kaçınmak için bir başka iyi neden (ör. İçlerinde boşluk var) :-) - Matt Wallis


git archive ayrıca uzak depo ile çalışır.

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

Repo içindeki belirli bir yolu dışa aktarmak için, son argümanı olarak gitmek istediğiniz kadar çok yol ekleyin, örn .:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

241
2017-12-09 18:59



Bu en sevdiğim seçenek. Ayrıca, çıplak depolarda da çalışmasının ek yararı vardır. - innaM
Geliştirilmiş versiyonu: git archive --format=tar --prefix=PROJECT_NAME/ --remote=USER@SERVER:PROJECT_NAME.git master | tar -xf -  (arşivinizin bir klasörde olmasını sağlar) - Nick
Not: Sunucu bu özelliği etkinleştirmelidir. - Jakub Narębski
Denedim : git archive --format=zip --output foo.zip --remote=https://github.com/xxx.git master Ve ölümcül oldu: Operasyon protokol tarafından desteklenmiyor. Beklenmeyen komut akışı sonu. - andyf
@andyf GitHub'un kendi yolu vardır: curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf - başına docs - bishop


enter image description here

Havuzun GitHub'da barındırılması durumunda özel bir vaka yanıtı.

Sadece kullan svn export.

Bildiğim kadarıyla Github izin vermiyor archive --remote. GitHub olmasına rağmen svn uyumlu ve tüm git reposları var svn erişilebilir böylece sadece kullanabilirsiniz svn export Normalde GitHub URL'nizde birkaç ayar yaptığınız gibi.

Örneğin tüm bir depoyu dışa aktarmak için trunkURL'de değiştirir master (ya da projenin HEAD şubesi):

svn export https://github.com/username/repo-name/trunk/

Tek bir dosyayı veya hatta belirli bir yolu veya klasörü dışa aktarabilirsiniz:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

İle örnek jQuery JavaScript Kitaplığı

HEAD şube veya ana şube kullanarak mevcut olacak trunk:

svn ls https://github.com/jquery/jquery/trunk

OlmayanHEAD  dalları altında erişilebilir olacak /branches/:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

Herşey etiketler altında /tags/ aynı moda:

svn ls https://github.com/jquery/jquery/tags/2.1.3

48
2017-10-30 17:03



git archive Git protokolünü kullandığınız sürece GitHub ile iyi çalışır, Sadece değiştir https:// ile git:// URL’de GitHub'un bu gizli özelliği neden reklam vermediğini bilmiyorum. - Neil Mayhew
@NeilMayhew Benim için çalışmıyor, anladım fatal: The remote end hung up unexpectedly. JQuery github repo ile iki farklı sunucu üzerinde çalıştı. - Anthony Hatzopoulos
Haklısın. Kullandığımı unutmuştum git config url.<base>.insteadOf uzak depoyu önbelleğe almak için. Bu yüzden bir file:// Gerçekte URL. Bundan şüphe ediyorum git archive ile çalışabilir git:// Çalışabilmesi gerektiğinden beri URL'ler git-upload-archive uzak uçta. Kullanarak mümkün olmalıdır ssh protokol, github izin vermez (Invalid command: 'git-upload-archive'). - Neil Mayhew
Yerel olarak barındırılan git depolarında yapmak istiyorsam, github gibi davranan yerel bir sunucu aracını kullanmanın herhangi bir yolu var mı? - kriss
upvoted - Git'in bu özelliğe sahip olmaması ve svn'ye başvurmamız çok garip - Jason S


İtibaren Git Kılavuzu:

"Tüm bir ağacın dışa aktarılması" için git-çıkış-endeksini kullanma

Önekleme yeteneği temel olarak git-çıkış-endeksini "ağaç olarak dışa aktarma" işlevi olarak kullanılmasını önemsiz kılar. İstediğiniz ağacı dizine girin ve yapın:

$ git checkout-index --prefix=git-export-dir/ -a


38
2017-10-02 02:27



Sanırım karışıklık "istenen ağacı indekse oku" ifadesidir. - davetron5000
Dizin foo'yu şube çubuğuna vermek istiyorsanız, o zaman bu olurdu git read-tree bar:foo Ve sonra git checkout-index --prefix=export_dir/ -a bundan sonra belki yapmalısın git update-index master - Pascal Rosin
Bunun neden kabul edilen cevap olmadığını bilmiyorum. - John Weldon
@JohnWeldon Önce repo'yu klonlaman gerekiyor mu? Eğer öyleyse, o zaman kabul etmem, çünkü bir alt dizinin "svn export" noktasının tamamı, bu alt dizinin bir kopyasını doğrudan almaktır; Birisi bir 1GB Git repo'una sahipse ve tek istediğim bir 10kB alt diziniyse, her şeyi klonlamamı gerektiren bir şey. - Jason S
Ayrıca "davetiyeyi istediğim ağacı okumanın" ne demek olduğunu söyleyeyim. - Jason S


Etrafında basit bir sarıcı yazdım git-checkout-index Bu şekilde kullanabilirsiniz:

git export ~/the/destination/dir

Hedef dizin zaten varsa, eklemeniz gerekir -f veya --force.

Kurulum basittir; komut dosyasını yalnızca bir yere bırakın PATHve çalıştırılabilir olduğundan emin olun.

İçin github deposu git-export 


37
2017-10-16 17:17



Bu sarıcı platform-agnostik değildir; / bin / sh'ye dayanır. Yani eğer Windows üzerindeyseniz, bu çözüm muhtemelen senin için çalışmayacak. - shovavnik
Uhh, bu betik 57 satırlık belge, boşluk, kurulum, argüman ayrıştırma ve aslında bir şey yapan sadece bir satır ... - Vladimir Panteleev


Bunun, Git ile SVN'den daha az sorun olduğu anlaşılmaktadır. Git yalnızca bir .git klasörünü depo köküne yerleştirir, oysa SVN her alt dizine bir .svn klasörü koyar. Yani "svn export", yinelemeli komut satırı sihrini önler, oysa Git yinelemesi gerekli değildir.


35
2018-05-12 04:20



SVN 1.7'den itibaren, sadece bir .svn klasörü var: subversion.apache.org/docs/release-notes/1.7.html#single-db - kostmo
Bu, svn dışa aktarma silmelerini içeren ek yapı dosyalarından kurtulmaz. Yani bu kesinlikle cevap değil. - ygoe
Cevap geçersiz olduğundan reddedildi. - bahrep


Eşdeğeri

svn export . otherpath

mevcut bir repo içinde

git archive branchname | (cd otherpath; tar x)

Eşdeğeri

svn export url otherpath

olduğu

git archive --remote=url branchname | (cd otherpath; tar x)

26
2018-02-23 15:41



teşekkürler, bu benim eksik olduğum şeydi ... ayrıca, ihracatın zaman damgalarını kontrol etmek (dosyalar gibi korunmayacaklar), git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -) ... Ancak, zaman damgaları ile arşivleme tam olarak önemsiz değil, bu yüzden bir aşağıdaki örnek. - sdaau
Aşağıdaki gibi alt kabuk yerine katran için C seçeneğini kullanabilirsiniz: git archive branchname | tar xC otherpath - James Moore
O yukarı doğru C katran seçeneği sadece GNU Tar'dır. - aredridel


Git-altmodülleri yoğun olarak kullanıyorum. Bu benim için çalışıyor:

rsync -a ./FROM/ ./TO --exclude='.*'

21
2017-09-13 06:26



Adları bir nokta ile başlayan özgeçmiş dosyaları .htaccess? - Greg Hewgill
İyi bir çözüm, değişecektir --exclude = '. *' - --exclude = '. Git *' - schmunk
- Eğer bu incelemesi yapacak olsaydın --exclude-vcs - plod
./FROM/ uzak bir repo olabilir mi? - Resist Design
Bir FYI olarak benim kopyasını rsync argümanı --cvs-exclude. Ayrıca, hala kopyalanır .gitattributes ve .gitignore - Ryan Ransford