Przeglądaj i wyświetlaj pliki w repozytorium git bez klonowania


107

Czy istnieje sposób na przeglądanie i wyświetlanie plików w repozytorium git bez wcześniejszego ich klonowania? Mogę to zrobić w svn za pomocą poleceń:

svn ls / ścieżka / do / repo 
svn cat / path / to / repo / file-in-repo

Mogę podobno korzystać z git show, ale robię:

git show / path / to / repo
git show HEAD: / ścieżka / do / repo

wynik do

fatal: To nie jest repozytorium git

Odpowiedzi:


72

Polecenie, którego potrzebujesz, git ls-remotepozwala ci uzyskać informacje o zdalnych repozytoriach, ale nie możesz wyświetlić historii ani wyświetlić katalogów ani czegokolwiek na tym poziomie: w zasadzie pozwala tylko zobaczyć zdalne obiekty na bardzo wysokim poziomie (możesz zobaczyć na przykład aktualne HEAD i tagi).

Jedynym prawdziwym sposobem na zrobienie tego, co chcesz (jeśli dobrze rozumiem), byłoby użycie ssh do uruchomienia zdalnego polecenia i zwrócenia wyników, na przykład:

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

To, czego chcesz, byłaby cudowną funkcjonalnością, gdyby mogli ją dodać, ale z tego, co przeczytałem, nie jest to łatwe, ponieważ pobieranie historii itp. Wymaga wielu informacji, aby były lokalne, a w tym momencie równie dobrze możesz wykonać pobieranie git .


14
Jedną rzeczą, którą możesz zrobić git clone, jest pobranie tylko jednej wersji przez przekazanie --depth 1. Pozwala to uniknąć pobierania potencjalnie dużej ilości historii i wystarczyłoby, aby odpowiedzieć na pytania typu „które pliki są obecne w wersji abcdef1234567890?”
ctrueden

21

Git jest rozproszonym systemem kontroli wersji, podczas gdy Subversion jest scentralizowanym (klient-serwer) systemem kontroli wersji. Działają inaczej; przyzwyczaj się do tego. Przeczytaj moją odpowiedź wyjaśniającą konsekwencje tej różnicy dla gitowego odpowiednikasvn status -u pytania w StackOverflow.

Trochę się powtarzam: w scentralizowanym systemie kontroli wersji (takim jak CVS lub Subversion) prawie wszystkie polecenia są przetwarzane na serwerze i obejmują sieć. Bardzo niewiele poleceń jest wykonywanych lokalnie. Zauważ, że aby mieć dobrą wydajność "svn status" i "svn diff", Subversion przechowuje "nieskazitelną kopię" wyewidencjonowanej wersji na kliencie, aby nie musieć wiązać się z transferem sieciowym dla tych typowych operacji (oznacza to, że Subversion checkout = 2 x przynajmniej rozmiar katalogu roboczego).

W rozproszonym systemie kontroli wersji (takim jak Git, Mercurial czy Bazaar), gdzie masz lokalną kopię (klon) całego repozytorium, prawie wszystkie polecenia są wykonywane na kliencie . Bardzo niewiele poleceń wymaga połączenia sieciowego z innym repozytorium (z serwerem).

Liczba poleceń, które możesz wykonać na serwerze jest ograniczona.

  • Możesz wyświetlić listę wszystkich odwołań na pilocie za pomocą „ git ls-remote <URL>”.
  • Możesz uzyskać migawkę (części) repozytorium (jeśli zdalny serwer ją włączył) za pomocą polecenia
    git archive --remote = <URL> HEAD”.
  • Możesz sklonować tylko kilka ostatnich zatwierdzeń (tak zwanych "płytkich klonów") za pomocą
    " git clone --depth = 1 <URL>".
  • Jeśli serwer udostępnia repozytorium interfejs WWW git, możesz go użyć do przeglądania.

36
Tak poprawny jak Ty, jeśli przeglądasz zdalne repozytorium bez wcześniejszego klonowania go, to oczywiście zdecydowałeś, że możesz zrezygnować z możliwości offline git. Biorąc to pod uwagę, nie widzę powodu, aby udawać, że nie byłaby to użyteczna funkcja do niektórych rzeczy, na przykład lokalnego klienta, który pozwala lokalnie przeglądać zawartość pliku zdalnego repozytorium.
LadyCailin

12
Zgoda, stanowisko, które zajmuje Jakub jest bardzo restrykcyjne. Warto więcej niż raz stracić reputację, aby zwrócić na to uwagę.
ctpenrose

9
Nie podoba mi się ton "przyzwyczajaj się do tego"., Ale kiedy czytałem do końca, znalazłem rozwiązanie mojego obecnego problemu - czekając na to, co jest w repozytorium 110, mam jednego gita, ale nie mam dostępu do ssh lub powłoki, a które są wszystko prawdopodobnie dość duże, jakieś 12 GB lub więcej. Tak więc klon o zminimalizowanej głębokości pomaga przynajmniej zobaczyć tylko najnowszą interesującą historię. i spraw, aby repozytorium git było jak najmniejsze.
Henning

3
Taka funkcjonalność byłaby miła w przypadku narzędzi do przeglądu kodu, gdzie nie jest potrzebne całe repozytorium, wystarczy zalogować się ze zmianami.
Łukasz Lenart

2
@Henning, masz rację, myślę, że możesz to nazwać tonem „git przyzwyczajonym do tego” LOL
SN

17

Zajrzyj na http://git-scm.com/book/en/Git-Internals-Transfer-Protocols, aby dowiedzieć się, jak to zrobić w przypadku niektórych protokołów transportowych. Zwróć uwagę, że to nie zadziała w przypadku standardowego Git przez SSH.

Dla git przez SSH, aktualny git po stronie serwera powinien pozwolić ci na archiwizację git bezpośrednio z pilota, co możesz następnie np. Przesłać potokiem do „tar t”, aby uzyskać listę wszystkich plików w danym zatwierdzeniu.


13

GitHub jest kompatybilny z svn, więc możesz używać svn ls

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

BitBucket obsługuje archiwum git, więc możesz pobrać archiwum tar i wyświetlić listę zarchiwizowanych plików. Nie jest zbyt wydajny, ale działa:

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

6
Nie myl Git z GitHub :)
LR

wydaje się również dość delikatny - działając na wielu (około 100) repozytoriach, otrzymuję różne błędy z svn: "nie można pobrać wpisów spoza katalogu" "500 Wewnętrzny błąd serwera" "Brak danych logowania"
MichaelChirico

5

Nie do końca, ale na odwrót.

Użyj GitHub Developer API

  1. Otwarcie tego spowoduje wyświetlenie ostatnich zatwierdzeń.

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

    Możesz uzyskać szczegółowe informacje o zatwierdzeniu, dołączając skrót zatwierdzenia na końcu powyższego adresu URL.

  2. Wszystkie pliki (potrzebujesz sha do głównego drzewa)

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

Mam nadzieję, że to pomoże.


17
Nie myl Git z GitHub - uważam, że oryginalne pytania dotyczyły samego Gita. Instalacje / hostingi Git (GitHub / BitBucket / Stash) mogą mieć różne możliwości repozytoriów przeglądarki.
Krzysztof Wolny

Dobry pomysł @Anurag Kanungo Thinking outside the box 😉
eonist,

2

Jest to prawdopodobnie uważane przez niektórych za brudne, ale bardzo praktycznym rozwiązaniem w przypadku repozytoriów github jest po prostu stworzenie skryptu, np. "Git-ls":

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

Uczynić go wykonywalnym i osiągalny przedmiotu: chmod a+x git-ls; sudo cp git-ls /usr/local/bin. Teraz po prostu uruchom go tak, jak chcesz:

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

Wiedz również, że istnieje git instawebnarzędzie do plików lokalnych. Możliwość wyświetlania plików i posiadania takiego serwera, moim zdaniem, nie niszczy żadnej z nieodłącznych zdecentralizowanych cech git.


Nie mam z tym żadnych rezultatów. curl nie wydaje się zwracać niczego.
Matthew Przeczytaj

Zdecydowanie poleciłbym teraz metodę API firmy Anarug. Ta metoda jednak nadal działa:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum

-1

jeśli znasz zdalny oddział, który chcesz sprawdzić, najnowsze informacje możesz znaleźć przez:

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

8
to nie zadziała, jeśli wcześniej nie sklonujesz repozytorium :(
Bálint Szigeti
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.