Parcourir et afficher les fichiers dans un dépôt git sans clonage

107

Existe-t-il un moyen de parcourir et d'afficher des fichiers dans un référentiel git sans le cloner au préalable? Je peux faire ceux dans svn en utilisant les commandes:

svn ls / chemin / vers / repo 
svn cat / chemin / vers / repo / fichier-dans-repo

Je peux supposément utiliser git show mais en faisant:

git show / chemin / vers / repo
git show HEAD: / chemin / vers / repo

résultat à

fatal: pas un dépôt git
Christian Alis
la source

Réponses:

72

La commande que vous voulez est celle git ls-remotequi vous permet d'obtenir des informations sur les référentiels distants, mais vous ne pouvez pas afficher l'historique ou la liste des répertoires ou quoi que ce soit de ce niveau: essentiellement, cela ne vous permet de voir les objets distants qu'à un très haut niveau (vous pouvez voir le HEADs et tags actuels par exemple).

La seule vraie façon de faire ce que vous voulez (si je comprends bien) serait d'utiliser ssh pour exécuter une commande à distance et renvoyer les résultats, par exemple:

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

Ce que vous voulez, ce serait une belle fonctionnalité s'ils pouvaient l'ajouter, mais d'après ce que j'ai lu, ce n'est pas très facile car obtenir l'historique, etc. a besoin de beaucoup d'informations pour être local à git, et à ce stade, vous pouvez aussi bien avoir fait un git fetch .

jkp
la source
14
Une chose que vous pouvez faire git clone, cependant, est de ne récupérer qu'une seule révision en passant --depth 1. Cela évite de récupérer des quantités potentiellement importantes d'historique et serait suffisant pour répondre à des questions telles que "quels fichiers sont présents en révision abcdef1234567890?"
ctrueden
21

Git est un système de contrôle de version distribué , tandis que Subversion est un système de contrôle de version centralisé (client-serveur). Ils fonctionnent différemment; Habituez-vous à cela. Veuillez lire ma réponse expliquant les conséquences de cette différence par rapport à l' équivalent git de lasvn status -u question chez StackOverflow.

Je me répète un peu: dans un système de contrôle de version centralisé (comme CVS ou Subversion) presque toutes les commandes sont traitées sur le serveur , et impliquent le réseau. Très peu de commandes sont exécutées localement. Notez que pour avoir de bonnes performances de "svn status" et "svn diff" Subversion stocke la "copie vierge" de la version extraite sur le client, pour ne pas avoir à impliquer de transfert réseau pour ces opérations courantes (cela signifie que Subversion checkout = 2 x au moins la taille du répertoire de travail).

Dans un système de contrôle de version distribué (comme Git, Mercurial ou Bazaar), où vous avez une copie locale (clonage) d'un référentiel entier, presque toutes les commandes sont exécutées sur le client . Très peu de commandes nécessitent une connexion réseau à un autre référentiel (au serveur).

Le nombre de commandes que vous pouvez exécuter sur le serveur est limité.

  • Vous pouvez lister toutes les références sur remote avec " git ls-remote <URL>".
  • Vous pouvez obtenir un instantané de (une partie) du référentiel (si le serveur distant l'a activé) avec
    " git archive --remote = <URL> HEAD".
  • Vous ne pouvez cloner que quelques derniers commits (appelés "clone peu profond") avec
    " git clone --depth = 1 <URL>".
  • Si le serveur fournit une interface Web git au référentiel, vous pouvez l'utiliser pour naviguer.
Jakub Narębski
la source
36
Aussi correct que vous soyez, si vous parcourez un référentiel distant sans le cloner au préalable, vous avez évidemment décidé qu'il était acceptable de renoncer aux capacités hors ligne de git. Compte tenu de cela, je ne vois aucune raison de prétendre que ce ne serait pas une fonctionnalité utile pour certaines choses, par exemple, un client local qui vous permet de parcourir localement le contenu du fichier d'un dépôt distant.
LadyCailin
12
D'accord, la position adoptée par Jakub est très restrictive. Cela vaut la peine de perdre sa réputation plus d'une fois pour le souligner.
ctpenrose
9
Je n'aime pas le ton «s'habituer à ça»., Mais quand j'ai lu jusqu'à la fin, j'ai trouvé une solution à mon problème actuel - je veux voir ce qu'il y a dans le référentiel 110, j'ai un git, mais pas d'accès ssh ou shell, et lesquels sont tous probablement assez gros, environ 12 Go. Ainsi, le clone avec une profondeur réduite aide au moins à ne voir que l'histoire récente intéressante. et rendre le dépôt git aussi petit que possible.
Henning
3
Une telle fonctionnalité serait bien d'avoir dans le cas d'outils de révision de code où vous n'avez pas besoin de tout le dépôt, il suffit de se connecter avec les modifications.
Lukasz Lenart
2
@Henning, c'est vrai, je suppose que vous pourriez l'appeler le ton "git used to that" LOL
SN
17

Jetez un œil à http://git-scm.com/book/en/Git-Internals-Transfer-Protocols pour plus d'informations sur la façon de procéder avec certains protocoles de transport. Notez que cela ne fonctionnera pas pour git standard sur SSH.

Pour git sur SSH, un git côté serveur à jour devrait vous permettre de git-archiver directement à partir de la télécommande, que vous pourriez alors par exemple diriger vers "tar t" pour obtenir une liste de tous les fichiers dans un commit donné.

Jérôme Baum
la source
13

GitHub est compatible svn, vous pouvez donc utiliser svn ls

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

BitBucket prend en charge l'archive git afin que vous puissiez télécharger une archive tar et répertorier les fichiers archivés. Ce n'est pas très efficace mais fonctionne:

git archive [email protected]:repository HEAD directory | tar -t
fela
la source
6
Ne confondez pas Git avec GitHub :)
LR
il se sent aussi assez fragile - fonctionnant sur de nombreux dépôts (environ 100), j'obtiens diverses erreurs de svn: "impossible d'obtenir les entrées de non-répertoire" "500 Internal Server Error" "Plus d'informations d'identification"
MichaelChirico
5

Pas l'exact, mais un moyen de contourner.

Utiliser l'API de développement GitHub

  1. L'ouvrir vous donnera les derniers commits.

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

    Vous pouvez obtenir les détails de validation spécifiques en attachant le hachage de validation à la fin de l'url ci-dessus.

  2. Tous les fichiers (vous avez besoin de sha pour l'arborescence principale)

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

J'espère que cela peut aider.

Anurag Kanungo
la source
17
Ne confondez pas Git avec GitHub - je pense que les questions originales concernaient Git lui-même. Les installations / hébergements Git (GitHub / BitBucket / Stash) peuvent avoir diverses possibilités pour les référentiels de navigateur.
Krzysztof Wolny
Bonne idée @Anurag Kanungo Penser en dehors des sentiers battus 😉
eonist
2

Ceci est probablement considéré comme sale par certains, mais une solution très pratique dans le cas des référentiels github est simplement de créer un script, par exemple "git-ls":

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

Le rendre exécutable et accessible bien sûr: chmod a+x git-ls; sudo cp git-ls /usr/local/bin. Maintenant, exécutez-le comme vous le souhaitez:

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

Sachez également qu'il existe un git instawebutilitaire pour vos fichiers locaux. Avoir la possibilité d'afficher des fichiers et d'avoir un serveur comme celui-là ne détruit à mon avis aucune des caractéristiques décentralisées inhérentes à git.

Anne van Rossum
la source
Je n'obtiens aucun résultat avec ça. curl ne semble rien renvoyer.
Matthew Read
Je recommanderais maintenant définitivement la méthode api d'Anarug. Cette méthode fonctionne toujours cependant:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum
-1

si vous connaissez la branche distante que vous souhaitez vérifier, vous pouvez trouver la dernière via:

git ls-tree -r <remote_branch> --name-only
LinconFive
la source
8
cela ne fonctionne pas si vous ne clonez pas le dépôt auparavant :(
Bálint Szigeti