2010-11-09 6 views
14

Existe-t-il un moyen de vérifier si un fichier sous un chemin relatif spécifié existe dans une télécommande? Je vais bien aller chercher l'info en premier si c'est la seule option. En d'autres termes je cherche des fichiers git-ls avec une option pour spécifier remote et branch. Je suis seulement intéressé si le fichier existe (une liste de fichiers sur la branche va faire aussi bien), je ne me soucie pas de hash, diffs etc.Comment vérifier si un fichier existe dans une télécommande?

Répondre

22

Vous pouvez utiliser

git cat-file -e <remote>:<filename> 

qui sera quitte avec zéro lorsque le fichier existe. Au lieu de <remote> ci-dessus, vous utiliseriez un nom de branche distante (mais il pourrait s'agir en fait d'une référence d'objet arborescente). Pour utiliser une telle branche distante, vous devez configurer le référentiel distant et l'extraire (c'est-à-dire en utilisant git remote add + git fetch).

Un exemple concret:

$ git cat-file -e origin/master:README && echo README exists 
README exists 

$ git cat-file -e origin/master:FAILME 
fatal: Not a valid object name origin/master:FAILME 

Deux choses à noter:

  • Utilisez / comme séparateur de chemin dans les noms de fichiers, même par exemple Les fenêtres.
  • <filename> est un chemin d'accès complet (tel que foo/bar/README), relatif à la racine du référentiel.
+1

par '' vous dire un branche distante, ce qui signifie que vous devez avoir configuré la télécommande et lancez 'git fetch ' en premier; vous examinez la succursale distante dans votre repo, vous devez donc vous assurer qu'il est à jour. – Cascabel

+0

Justement, merci. J'ai incorporé cela dans la réponse. – earl

6

Vous pouvez utiliser git archive pour accéder aux fichiers individuels sans avoir à télécharger tout autre partie d'un dépôt:

if git archive --format=tar \ 
       --remote=<remote_name-or-URL> master README >/dev/null; then 
    echo 'master has README' 
else 
    echo 'master does not have README (or other error)' 
fi 

Le service d'archives (upload-archive) ne peut pas être activé sur tous les serveurs ou les dépôts cependant, vous aurez pour le tester pour les serveurs et les référentiels auxquels vous devez accéder.

Si le service d'archivage n'est pas disponible, vous devrez récupérer les objets par des moyens normaux. Si vous ne disposez pas déjà d'une installation à distance pour le référentiel en question, vous pouvez effectuer une extraction "superficielle" dans FETCH_HEAD (ceci doit être fait dans un dépôt Git, mais il peut être complètement indépendant ou même vide):

git fetch --depth=1 remote_name-or-URL master 
if git rev-parse --verify --quiet FETCH_HEAD:README >/dev/null; then 
    echo "repository's master has README" 
else 
    echo "repository's master does not have README" 
fi 

Si vous avez une définition à distance pour le dépôt, vous voulez probablement juste pour le mettre à jour et accéder au fichier à travers les normales branches de suivi à distance:

git fetch remote_name 
if git rev-parse --verify --quiet remote_name/master:README >/dev/null; then 
    echo "remote's master has README" 
else 
    echo "remote's master does not have README" 
fi 
+0

Des trucs géniaux! Vraiment utile –

+1

soyez averti: la solution 'git-archive' ne fonctionne pas de manière fiable. il semble vérifier uniquement l'existence des fichiers/répertoires de premier niveau, par exemple: 'git archive --remote = le répertoire principal-exists/then/some/nonsense/chemin' sortirait avec 0 –

Questions connexes