Dosyaları klonlamadan bir git deposundaki dosyalara göz atın ve görüntüleyin


107

Önce klonlamadan bir git deposundaki dosyalara göz atmanın ve görüntülemenin bir yolu var mı? Bunları svn'de şu komutları kullanarak yapabilirim:

svn ls / yol / / repo 
svn cat / yol / to / repo / depoda dosya

Sözde git show'u kullanabilirim ama yapıyorum:

git göster / yol / depo
git show HEAD: / yol / / repo

sonuç

ölümcül: Git deposu değil

Yanıtlar:


72

İstediğiniz komut, git ls-remoteuzak depolar hakkında bazı bilgiler almanıza izin verir, ancak geçmişi gösteremez veya dizinleri veya bu seviyedeki herhangi bir şeyi listeleyemezsiniz: esasen yalnızca uzaktaki nesneleri çok yüksek bir seviyede görmenize izin verir ( örneğin mevcut HEAD'ler ve etiketler).

İstediğinizi yapmanın tek gerçek yolu (eğer doğru anladıysam) ssh kullanarak uzaktan komut çalıştırmak ve sonuçları döndürmek olacaktır, örneğin:

ssh me@otherhost "cd repo && git log -n 10"

İstediğiniz şey, ekleyebilseler çok hoş bir işlevsellik olurdu, ancak okuduklarıma göre bu çok kolay değil çünkü tarih vb. Yerel olmak için çok fazla bilgiye ihtiyaç duyuyor ve bu noktada bir git getirme işlemi yapmış olabilirsiniz. .


14
git cloneBununla birlikte , yapabileceğiniz bir şey , geçirerek yalnızca tek bir revizyon almaktır --depth 1. Bu, potansiyel olarak büyük miktarda geçmiş getirmeyi önler ve "hangi dosyalar revizyonda mevcut abcdef1234567890?" Gibi soruları yanıtlamak için yeterli olur.
ctrueden

21

Git, dağıtılmış sürüm kontrol sistemidir, Subversion ise merkezi (istemci-sunucu) sürüm kontrol sistemidir. Farklı çalışırlar; alışmak. Lütfen StackOverflow'daki sorunun git eşdeğerine göresvn status -u bu farkın sonuçlarını açıklayan cevabımı okuyun .

Kendimi biraz tekrar ediyorum: merkezi sürüm kontrol sisteminde (CVS veya Subversion gibi) neredeyse tüm komutlar sunucuda işlenir ve ağı içerir. Yerel olarak çok az komut gerçekleştirilir. "Svn durumu" ve "svn diff" için iyi bir performansa sahip olmak için, Subversion istemcide kullanıma alınmış sürümün 'bozulmamış kopyasını' bu yaygın işlemler için ağ aktarımını dahil etmek zorunda kalmamak için saklamaktadır (bu, Subversion checkout = 2 x en azından çalışma dizininin boyutu).

Tüm deponun yerel kopyasına (klonlama) sahip olduğunuz dağıtılmış sürüm kontrol sisteminde (Git, Mercurial veya Bazaar gibi) neredeyse tüm komutlar istemci üzerinde gerçekleştirilir . Çok az komut, diğer depoya (sunucuya) ağ bağlantısı gerektirir.

Sunucuda gerçekleştirebileceğiniz komut sayısı sınırlıdır.

  • " Git ls-remote <URL>" ile uzaktaki tüm referansları listeleyebilirsiniz .

  • " Git archive --remote = <URL> HEAD" ile havuzun (bölümünün) anlık görüntüsünü (uzak sunucu etkinleştirdiyse) alabilirsiniz.

  • " Git clone --depth = 1 <URL>" ile yalnızca birkaç son kaydı ("sığ klon" olarak adlandırılır) klonlayabilirsiniz .
  • Sunucu, depoya git web arayüzü sağlıyorsa, gezinmek için kullanabilirsiniz.

37
Doğru olduğu kadar, uzak bir depoyu klonlamadan tarıyorsanız, git'in çevrimdışı yeteneklerinden vazgeçmenin uygun olduğuna karar vermişsinizdir. Buna göre, bunun bazı şeyler için yararlı bir özellik olmayacağını düşünmek için hiçbir neden görmüyorum, örneğin, uzak bir deponun dosya içeriğine yerel olarak göz atmanıza izin veren yerel bir istemci.
LadyCailin

12
Kabul edildi, Jakub'un aldığı pozisyon oldukça kısıtlayıcı. Bunu belirtmek için bir kereden fazla itibar kaybetmeye değer.
ctpenrose

9
"Buna alışma" tonundan hoşlanmıyorum, ancak sonuna kadar okuduğumda mevcut sorunuma bir çözüm buldum - 110 depoda ne olduğunu görmek istiyordum, ancak ssh veya kabuk erişimim yok ve hangileri hepsi muhtemelen oldukça büyük, 12GB kadar. Yani minmize derinliğe sahip klon, en azından yalnızca yakın zamanlardaki ilginç tarihi görmeye yardımcı olur. ve git deposunu olabildiğince küçük yapın.
Henning

3
Tüm depoya ihtiyaç duymadığınız kod inceleme araçları durumunda, bu tür bir işlevselliğe sahip olmak güzel olurdu, sadece değişikliklerle kayıt yapmak yeterlidir.
Lukasz Lenart

2
@Henning, Haklısın, sanırım buna "buna alışkın" tonu diyebilirsin LOL
SN

17

Bunun bazı aktarım protokolleri üzerinden nasıl yapılacağı hakkında bilgi için http://git-scm.com/book/en/Git-Internals-Transfer-Protocols'a bir göz atın . Bunun SSH üzerinden standart git için çalışmayacağını unutmayın.

SSH üzerinden git için, güncel bir sunucu tarafı git, doğrudan uzaktan git-arşivlemenize izin vermelidir, daha sonra örneğin belirli bir işlemedeki tüm dosyaların bir listesini almak için "tar t" 'ye yönlendirebilirsiniz.


13

GitHub svn uyumludur, böylece svn ls'yi kullanabilirsiniz

svn ls https://github.com/user/repository.git/branches/master/

BitBucket git arşivini destekler, böylece tar arşivini indirebilir ve arşivlenmiş dosyaları listeleyebilirsiniz. Çok verimli değil ama işe yarıyor:

git archive --remote=git@bitbucket.org:repository HEAD directory | tar -t

6
Git'i GitHub ile karıştırmayın :)
LR

aynı zamanda oldukça kırılgan hissettiriyor - birçok (yaklaşık 100) depoda çalışırken, svn'den çeşitli hatalar alıyorum: "dizin dışı girişler alınamıyor" "500 Dahili Sunucu Hatası" "Artık kimlik bilgisi yok"
MichaelChirico

5

Tam değil, ama bir yol.

GitHub Developer API'yi kullanın

  1. Bunu açmak size son kayıtları alacaktır.

    https://api.github.com/repos/learningequality/ka-lite/commits

    Yukarıdaki url'nin sonuna kaydetme hashini ekleyerek belirli kaydetme ayrıntılarını alabilirsiniz.

  2. Tüm dosyalar (Ana ağaç için sha'ya ihtiyacınız var)

    https://api.github.com/repos/learningequality/ka-lite/git/trees/7b698a988683b161bdcd48a949b01e2b336b4c01

Umarım bu yardımcı olabilir.


17
Git'i GitHub ile karıştırmayın - Orijinal soruların Git'in kendisiyle ilgili olduğuna inanıyorum. Git kurulumları / barındırmaları (GitHub / BitBucket / Stash) tarayıcı havuzları için çeşitli olasılıklara sahip olabilir.
Krzysztof Wolny

İyi fikir @Anurag Kanungo Kutunun dışında düşünmek 😉
eonist

2

Bu muhtemelen bazıları tarafından kirli olarak kabul edilir, ancak github depoları için çok pratik bir çözüm sadece bir komut dosyası oluşturmaktır, örneğin "git-ls":

#!/bin/sh
remote_url=${1:? "$0 requires URL as argument"}
curl -s $remote_url | grep js-directory-link | sed "s/.* title=\"\(.*\)\".*/\1/"

Uygulanabilir ve elbette erişilebilir hale getirin: chmod a+x git-ls; sudo cp git-ls /usr/local/bin . Şimdi, istediğiniz gibi çalıştırın:

git-ls https://github.com/mrquincle/aim-bzr
git-ls https://github.com/mrquincle/aim-bzr/tree/master/aim_modules

Ayrıca git instawebyerel dosyalarınız için bir yardımcı program olduğunu da bilin . Dosyaları gösterme ve bunun gibi bir sunucuya sahip olma yeteneğine sahip olmak, bence git'in doğasında bulunan merkezi olmayan özelliklerinden hiçbirini yok etmez.


Bununla herhangi bir sonuç alamıyorum. curl hiçbir şey döndürmüyor gibi görünüyor.
Matthew

Şimdi kesinlikle Anarug'dan api yöntemini tavsiye ederim. Bu yöntem hala işe yarıyor:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum

-1

Kontrol etmek istediğiniz uzak şubeyi biliyorsanız, en güncel olanı şu yolla öğrenebilirsiniz:

git ls-tree -r <remote_branch> --name-only

8
Daha önce
depoyu
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.