Durchsuchen und Anzeigen von Dateien in einem Git-Repo ohne Klonen

107

Gibt es eine Möglichkeit, Dateien in einem Git-Repo zu durchsuchen und anzuzeigen, ohne sie vorher zu klonen? Ich kann diese in svn mit den Befehlen machen:

svn ls / path / to / repo 
svn cat / path / to / repo / datei im repo

Ich kann angeblich Git Show benutzen, aber mache:

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

Ergebnis zu

fatal: Kein Git-Repository
Christian Alis
quelle

Antworten:

72

Mit dem gewünschten Befehl git ls-remotekönnen Sie einige Informationen zu Remote-Repositorys abrufen, aber Sie können keine Verlaufs- oder Listenverzeichnisse oder ähnliches anzeigen. Im Wesentlichen können Sie die Remote-Objekte nur auf einer sehr hohen Ebene anzeigen (Sie können die aktuelle HEADs und Tags zum Beispiel).

Die einzige echte Möglichkeit, das zu tun, was Sie wollen (wenn ich es richtig verstehe), besteht darin, mit ssh einen Remote-Befehl auszuführen und die Ergebnisse zurückzugeben, zum Beispiel:

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

Was Sie wollen, wäre eine schöne Funktionalität, wenn sie es hinzufügen könnten, aber nach dem, was ich gelesen habe, ist es nicht sehr einfach, da das Abrufen von Verlauf usw. viele Informationen benötigt, um lokal zu sein, und an diesem Punkt könnten Sie auch einen Git-Abruf durchgeführt haben .

jkp
quelle
14
Eine Sache, mit der Sie jedoch tun können git clone, ist, nur eine einzige Revision durch Bestehen abzurufen --depth 1. Dies vermeidet das Abrufen potenziell großer Mengen an Verlauf und würde ausreichen, um Fragen wie "Welche Dateien sind in der Revision vorhanden abcdef1234567890?" Zu beantworten.
ctrueden
21

Git ist ein verteiltes Versionskontrollsystem, während Subversion ein zentrales Versionskontrollsystem (Client-Server) ist. Sie arbeiten anders; gewöhne dich daran. Bitte lesen Sie meine Antwort, in der die Konsequenzen dieses Unterschieds zum Git-Äquivalent dersvn status -u Frage bei StackOverflow erläutert werden .

Ich wiederhole mich ein bisschen: In einem zentralen Versionskontrollsystem (wie CVS oder Subversion) werden fast alle Befehle auf dem Server verarbeitet und beziehen das Netzwerk mit ein. Sehr wenige Befehle werden lokal ausgeführt. Beachten Sie, dass Subversion für eine gute Leistung von "svn status" und "svn diff" eine "makellose Kopie" der ausgecheckten Version auf dem Client speichert und für diese allgemeinen Vorgänge keine Netzwerkübertragung erforderlich ist (dies bedeutet, dass Subversion checkout = 2 x ist) Größe des Arbeitsverzeichnisses mindestens).

In einem verteilten Versionskontrollsystem (wie Git, Mercurial oder Bazaar), in dem Sie eine lokale Kopie (Klon) eines gesamten Repositorys haben, werden fast alle Befehle auf dem Client ausgeführt . Sehr wenige Befehle erfordern eine Netzwerkverbindung zu einem anderen Repository (zum Server).

Die Anzahl der Befehle, die Sie auf dem Server ausführen können, ist begrenzt.

  • Sie können alle Referenzen auf Remote mit " git ls-remote <URL>" auflisten .
  • Mit
    " git archive --remote = <URL> HEAD" können Sie eine Momentaufnahme (eines Teils) des Repositorys abrufen (sofern der Remote-Server dies aktiviert hat) .
  • Sie können nur einige letzte Commits (sogenannter "flacher Klon") mit
    " git clone --depth = 1 <URL>" klonen .
  • Wenn der Server eine Git-Weboberfläche für das Repository bereitstellt, können Sie diese zum Durchsuchen verwenden.
Jakub Narębski
quelle
35
So korrekt Sie auch sind, wenn Sie ein Remote-Repo durchsuchen, ohne es zuvor zu klonen, haben Sie offensichtlich entschieden, dass es in Ordnung ist, auf die Offline-Funktionen von git zu verzichten. Angesichts dessen sehe ich keinen Grund, so zu tun, als wäre dies für einige Dinge keine nützliche Funktion, zum Beispiel für einen lokalen Client, mit dem Sie den Dateiinhalt eines Remote-Repos lokal durchsuchen können.
LadyCailin
11
Einverstanden ist die Position, die Jakub einnimmt, sehr restriktiv. Es lohnt sich, mehr als einmal den Ruf zu verlieren, um darauf hinzuweisen.
Ctpenrose
8
Ich mag den Ton "gewöhne dich an diesen" nicht, aber als ich bis zum Ende gelesen habe, habe ich eine Lösung für mein aktuelles Problem gefunden - ich wollte sehen, was sich im 110-Repository befindet, auf das ich einen Git habe, aber keinen SSH- oder Shell-Zugriff und auf welche alles wahrscheinlich ziemlich groß, ungefähr 12 GB. Der Klon mit einer minimierten Tiefe hilft also zumindest, nur die jüngste interessante Geschichte zu sehen. und mach das Git Repo so klein wie möglich.
Henning
2
Eine solche Funktionalität wäre bei Tools zur Codeüberprüfung hilfreich, bei denen Sie nicht das gesamte Repo benötigen. Es reicht aus, nur mit Änderungen zu protokollieren.
Lukasz Lenart
1
@ Henning, Richtig, ich denke, Sie könnten es den "git gewöhnt an diesen" Ton LOL
SN
16

Unter http://git-scm.com/book/en/Git-Internals-Transfer-Protocols finden Sie Informationen dazu, wie Sie dies über einige Transportprotokolle tun können. Beachten Sie, dass dies für Standard-Git über SSH nicht funktioniert.

Für Git über SSH sollte ein aktuelles serverseitiges Git es Ihnen ermöglichen, das Git-Archiv direkt von der Fernbedienung aus zu archivieren. Anschließend können Sie beispielsweise eine Pipe an "tar t" senden, um eine Liste aller Dateien in einem bestimmten Commit abzurufen.

Jerome Baum
quelle
13

GitHub ist svn-kompatibel, sodass Sie svn ls verwenden können

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

BitBucket unterstützt das Git-Archiv, sodass Sie das Tar-Archiv herunterladen und archivierte Dateien auflisten können. Es ist nicht sehr effizient, funktioniert aber:

git archive [email protected]:repository HEAD directory | tar -t
Fela
quelle
6
Verwechseln Sie Git nicht mit GitHub :)
LR
es fühlt sich auch ziemlich zerbrechlich an - wenn ich auf vielen (ungefähr 100) Repos laufe, bekomme ich verschiedene Fehler von svn: "Einträge von Nicht-Verzeichnissen können nicht
abgerufen werden
5

Nicht das genaue, aber ein Weg herum.

Verwenden Sie die GitHub Developer API

  1. Wenn Sie dies öffnen, erhalten Sie die letzten Commits.

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

    Sie können die spezifischen Festschreibungsdetails abrufen, indem Sie den Festschreibungs-Hash am Ende der obigen URL anhängen.

  2. Alle Dateien (Sie benötigen sha für den Hauptbaum)

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

Ich hoffe das kann helfen.

Anurag Kanungo
quelle
17
Verwechseln Sie Git nicht mit GitHub - ich glaube, die ursprünglichen Fragen betrafen Git selbst. Git-Installationen / Hostings (GitHub / BitBucket / Stash) bieten verschiedene Möglichkeiten, Browser-Repositorys zu durchsuchen.
Krzysztof Wolny
Gute Idee @Anurag Kanungo
Über
2

Dies wird wahrscheinlich von einigen als schmutzig angesehen, aber eine sehr praktische Lösung im Fall von Github-Repositories besteht darin, nur ein Skript zu erstellen, z. B. "git-ls":

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

Machen Sie es natürlich ausführbar und erreichbar : chmod a+x git-ls; sudo cp git-ls /usr/local/bin. Jetzt führen Sie es einfach aus, wie Sie möchten:

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

Beachten Sie auch, dass es ein git instawebDienstprogramm für Ihre lokalen Dateien gibt. Die Fähigkeit, Dateien anzuzeigen und einen solchen Server zu haben, zerstört meiner Meinung nach keine der inhärenten dezentralen Eigenschaften von git.

Anne van Rossum
quelle
Ich bekomme damit keine Ergebnisse. Curl scheint nichts zurückzugeben.
Matthew Read
Ich würde jetzt definitiv die API-Methode von Anarug empfehlen. Diese Methode funktioniert jedoch immer noch:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum
-1

Wenn Sie den Remote-Zweig kennen, den Sie überprüfen möchten, können Sie die neuesten Informationen erhalten über:

git ls-tree -r <remote_branch> --name-only
LinconFive
quelle
8
Es funktioniert nicht, wenn Sie das Repo vorher nicht geklont haben :(
Bálint Szigeti