Jelajahi dan tampilkan file dalam git repo tanpa kloning

107

Apakah ada cara untuk menelusuri dan menampilkan file dalam git repo tanpa mengkloningnya terlebih dahulu? Saya dapat melakukannya di svn menggunakan perintah:

svn ls / jalur / ke / repo 
svn cat / path / ke / repo / file-in-repo

Saya seharusnya dapat menggunakan pertunjukan git tetapi melakukan:

git show / path / to / repo
git show HEAD: / path / to / repo

hasil untuk

fatal: Bukan repositori git
Christian Alis
sumber

Jawaban:

72

Perintah yang Anda inginkan git ls-remotememungkinkan Anda mendapatkan beberapa informasi tentang repositori jarak jauh, tetapi Anda tidak dapat menampilkan riwayat atau daftar direktori atau apa pun dari level itu: pada dasarnya ini hanya memungkinkan Anda melihat objek jarak jauh pada tingkat yang sangat tinggi (Anda dapat melihat HEAD dan tag saat ini misalnya).

Satu-satunya cara nyata untuk melakukan apa yang Anda inginkan (jika saya mengerti dengan benar) adalah menggunakan ssh untuk menjalankan perintah jarak jauh dan mengembalikan hasilnya, misalnya:

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

Apa yang Anda inginkan akan menjadi fungsionalitas yang indah jika mereka dapat menambahkannya, tetapi dari apa yang saya baca itu tidak terlalu mudah karena mendapatkan riwayat dll membutuhkan banyak informasi agar menjadi lokal untuk git, dan pada saat itu Anda mungkin juga telah melakukan git fetch .

jkp
sumber
14
Namun, satu hal yang dapat Anda lakukan git cloneadalah mengambil hanya satu revisi dengan meneruskan --depth 1. Hal ini untuk menghindari kemungkinan pengambilan histori dalam jumlah besar, dan akan cukup untuk menjawab pertanyaan seperti "file mana yang ada dalam revisi abcdef1234567890?"
ctrueden
21

Git adalah sistem kontrol versi terdistribusi , sedangkan Subversion adalah sistem kontrol versi terpusat (client-server). Mereka bekerja secara berbeda; terbiasa dengan itu. Harap baca jawaban saya yang menjelaskan konsekuensi dari perbedaan itu dengan pertanyaan yang setarasvn status -u di StackOverflow.

Mengulangi diri sendiri sedikit: dalam sistem kontrol versi terpusat (seperti CVS atau Subversion) hampir semua perintah diproses di server , dan melibatkan jaringan. Sangat sedikit perintah yang dijalankan secara lokal. Perhatikan bahwa untuk memiliki kinerja yang baik dari "status svn" dan "svn diff" Subversion menyimpan 'salinan asli' dari versi check-out pada klien, tidak perlu melibatkan transfer jaringan untuk operasi umum tersebut (ini berarti bahwa Subversion checkout = 2 x ukuran direktori kerja setidaknya).

Dalam sistem kontrol versi terdistribusi (seperti Git, Mercurial atau Bazaar), di mana Anda memiliki salinan lokal (klon) dari seluruh repositori, hampir semua perintah dilakukan pada klien . Sangat sedikit perintah yang memerlukan koneksi jaringan ke repositori lain (ke server).

Jumlah perintah yang dapat Anda lakukan di server terbatas.

  • Anda dapat membuat daftar semua referensi pada remote dengan " git ls-remote <URL>".
  • Anda bisa mendapatkan snapshot dari (bagian) repositori (jika server jarak jauh mengaktifkannya) dengan
    " git archive --remote = <URL> HEAD".
  • Anda hanya dapat mengkloning beberapa commit terakhir (disebut "clone dangkal") dengan
    " git clone --depth = 1 <URL>".
  • Jika server menyediakan antarmuka web git ke repositori, Anda dapat menggunakannya untuk menjelajah.
Jakub Narębski
sumber
36
Betapapun benarnya Anda, jika Anda menjelajahi repo jarak jauh tanpa mengkloningnya terlebih dahulu, maka jelas Anda telah memutuskan bahwa tidak masalah untuk melepaskan kemampuan offline git. Mengingat itu, saya tidak melihat alasan untuk berpura-pura bahwa ini tidak akan menjadi fitur yang berguna untuk beberapa hal, misalnya, klien lokal yang memungkinkan Anda menelusuri konten file dari repo jarak jauh secara lokal.
LadyCailin
12
Setuju, posisi yang diambil Jakub sangat ketat. Penting untuk kehilangan reputasi lebih dari sekali untuk menunjukkan hal ini.
ctpenrose
9
Saya tidak suka nada "terbiasa dengan itu"., Tetapi ketika membaca sampai akhir saya menemukan solusi untuk masalah saya saat ini - ingin melihat apa yang ada di 110 repositori Saya memiliki satu git, tetapi tidak ada akses ssh atau shell ke, dan yang mana semua mungkin cukup besar, sekitar 12 GB atau lebih. Jadi klon dengan kedalaman yang diperkecil membantu setidaknya untuk hanya melihat sejarah menarik baru-baru ini. dan buat git repo sekecil mungkin.
Henning
3
Fungsionalitas seperti itu akan menyenangkan jika ada alat peninjau kode di mana Anda tidak memerlukan seluruh repo, cukup log dengan perubahan saja.
Lukasz Lenart
2
@Henning, Benar, saya rasa Anda bisa menyebutnya nada "git used to that" LOL
SN
17

Lihat http://git-scm.com/book/en/Git-Internals-Transfer-Protocols untuk info tentang cara melakukan ini pada beberapa protokol transport. Perhatikan bahwa ini tidak akan berfungsi untuk git standar melalui SSH.

Untuk git over SSH, git sisi server terbaru akan memungkinkan Anda untuk mengarsipkan git langsung dari jarak jauh, yang kemudian Anda dapat misalnya menyalurkan ke "tar t" untuk mendapatkan daftar semua file dalam komit yang diberikan.

Jerome Baum
sumber
13

GitHub kompatibel dengan svn sehingga Anda dapat menggunakan svn ls

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

BitBucket mendukung arsip git sehingga Anda dapat mengunduh arsip tar dan membuat daftar file yang diarsipkan. Ini tidak terlalu efisien tetapi berfungsi:

git archive [email protected]:repository HEAD directory | tar -t
fela
sumber
6
Jangan bingung Git dengan GitHub :)
LR
itu juga terasa cukup rapuh - berjalan di banyak (sekitar 100) repo, saya mendapatkan berbagai kesalahan dari svn: "tidak bisa mendapatkan entri non-direktori" "500 Internal Server Error" "Tidak ada lagi kredensial"
MichaelChirico
5

Bukan persisnya, tapi jalan memutar.

Gunakan GitHub Developer API

  1. Membuka ini akan memberi Anda komitmen terbaru.

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

    Anda bisa mendapatkan detail komit spesifik dengan melampirkan hash komit di akhir url di atas.

  2. Semua file (Anda membutuhkan sha untuk pohon utama)

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

Saya harap ini dapat membantu.

Anurag Kanungo
sumber
17
Jangan bingung membedakan Git dengan GitHub - Saya yakin pertanyaan orisinal adalah tentang Git itu sendiri. Instalasi / host Git (GitHub / BitBucket / Stash) dapat memiliki berbagai kemungkinan untuk repositori browser.
Krzysztof Wolny
Ide bagus @Anurag Kanungo Berpikir di luar kotak 😉
eonist
2

Ini mungkin dianggap kotor oleh beberapa orang, tetapi solusi yang sangat praktis dalam kasus repositori github adalah hanya membuat skrip, misalnya "git-ls":

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

Buatlah dieksekusi dan terjangkau tentu saja: chmod a+x git-ls; sudo cp git-ls /usr/local/bin. Sekarang, Anda tinggal menjalankannya sesuai keinginan:

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

Ketahuilah juga bahwa ada git instawebutilitas untuk file lokal Anda. Memiliki kemampuan untuk menampilkan file dan memiliki server seperti itu menurut saya tidak merusak salah satu karakteristik terdesentralisasi yang melekat pada git.

Anne van Rossum
sumber
Saya tidak mendapatkan hasil apa pun dengan ini. curl sepertinya tidak mengembalikan apapun.
Matius Baca
Saya sekarang pasti akan merekomendasikan metode api dari Anarug. Metode ini masih berfungsi:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum
-1

jika Anda mengetahui cabang jarak jauh yang ingin Anda periksa, Anda dapat mengetahui yang terbaru melalui:

git ls-tree -r <remote_branch> --name-only
LinconFive
sumber
8
tidak akan berhasil jika Anda tidak mengkloning repo sebelumnya :(
Bálint Szigeti