2010-11-09 14 views
14

Gibt es eine Möglichkeit zu überprüfen, ob eine Datei unter angegebenem relativen Pfad in einer Remote vorhanden ist? Mir geht es gut, wenn ich zuerst die Informationen abrufe, wenn es die einzige Option ist. Mit anderen Worten suche ich nach git-ls-Dateien mit einer Option zur Angabe von Remote und Branch. Ich bin nur daran interessiert, wenn die Datei (eine Liste der Dateien auf dem Zweig wird auch tun) vorhanden ist, ich kümmere mich nicht um Hashes, Diffs usw.Wie überprüfe ich, ob eine Datei in einer Fernbedienung existiert?

Antwort

22

Sie

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

verwenden können, die Exit mit Null, wenn die Datei existiert. Anstelle von <remote> oben würden Sie einen Remote-Zweig-Namen verwenden (aber es könnte tatsächlich jede Baum-Objekt-Referenz sein). Um einen solchen Remote-Zweig zu verwenden, müssen Sie das Remote-Repository konfigurieren und abrufen (z. B. mithilfe von git remote add + git fetch).

Ein konkretes Beispiel:

$ 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 

Zwei Dinge zu beachten:

  • Verwenden / als Pfadtrennzeichen in Dateinamen, auch auf z.B. Windows.
  • <filename> ist ein vollständiger Pfad (wie foo/bar/README), relativ zum Stamm des Repository.
+1

von '' Sie bedeuten Remote-Zweig, was bedeutet, dass Sie konfiguriert haben müssen die Fernbedienung und führen 'git fetch ' zuerst; Sie untersuchen die Remote-Zweigstelle in Ihrem Repo, Sie müssen also sicherstellen, dass sie aktuell ist. – Cascabel

+0

Genau, danke. Ich habe das in die Antwort aufgenommen. – earl

6

Sie können git archive verwenden, um einzelne Dateien zugreifen, ohne einen anderen Teil eines Endlagers Download:

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 

Der Archivdienst (upload-archive) kann allerdings nicht auf allen Servern oder Repositories aktiviert sein, müssen Sie um es für die Server und Repositories zu testen, auf die Sie zugreifen müssen.

Wenn der Archivierungsdienst nicht verfügbar ist, müssen Sie Objekte auf normale Weise abrufen.

Wenn Sie noch kein Remote-Setup für das fragliche Repository haben, können Sie einen "flachen" Abruf in FETCH_HEAD durchführen (dies muss in einem Git-Repository erfolgen, kann aber völlig unabhängig oder sogar leer sein):

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 

Wenn Sie remote eine für das Repository definiert sind, dann möchten Sie es wahrscheinlich aktualisieren gerade und Zugriff auf die Datei durch die normalen Fernverfolgung Filialen:

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

Tolles Zeug! Wirklich hilfreich –

+1

sei gewarnt: die 'git-archive' Lösung funktioniert nicht zuverlässig. Es scheint nur nach der Existenz der Dateien/Verzeichnisse auf der obersten Ebene zu suchen, z. B .: 'git archive --remote = Master-dir-das-existiert/then/some/nonsense/path' würde mit 0 enden –

Verwandte Themen