Wie lade ich eine einzelne Datei von GitLab herunter?
Lesezeit: 4 Minuten
Ich weiß, dass es möglich ist, die Kasse mit dem Pfad/zu/Datei abzurufen und dann zu verwenden, um diese bestimmte Datei herunterzuladen.
Mein Problem ist, dass ich eine Datenobergrenze von 1 MB pro Tag habe und git fetch alle Daten trotzdem herunterlädt, auch wenn sie nicht auf Disc gespeichert werden, bis ich git checkout verwende. Ich habe meine Daten trotzdem verwendet
Ist mein Verständnis davon, wie git fetch/checkout richtig ist? Gibt es eine Möglichkeit, eine bestimmte Datei nur herunterzuladen, um zu sehen, ob es eine neue Version gibt, bevor Sie mit dem Download fortfahren?
Mögliches Duplikat von How to sparsely checkout only one single file from a git repository?
– Thomas Weller
8. Juli 2019 um 22:44 Uhr
@ThomasWeller es ist ein anderes Problem.
– Benutzer9409752
8. Juli 2019 um 23:05 Uhr
ja2142
Gitlab hat dafür eine Rest-API.
Sie können mit curl eine Datei aus dem Repository abrufen:
Wenn Ihr Repository nicht öffentlich ist, müssen Sie auch ein Zugriffstoken bereitstellen, indem Sie hinzufügen --header 'Private-Token: <your_access_token>'.
Verbindungen:
Sie können hier überprüfen, wie Sie die Repository-API-ID finden.
Beachten Sie, dass dies eine GitLab-spezifische Lösung ist und nicht für andere Hostings funktioniert.
das ist so hilfreich, aber es hat einen Json mit den Metadaten der Datei zurückgegeben, die Rohdatei aus dem Repository abrufen GET /projects/:id/repository/files/:file_path/raw, aber es gibt den Inhalt der Datei zurück, der gut ist, aber ohne Herunterladen der eigentlichen Datei. Gibt es eine Möglichkeit, aktuelle Ordner/Dateien über die API herunterzuladen
– Benutzer9409752
9. Juli 2019 um 14:53 Uhr
Das Json-Feld „Inhalt“ ist base64 der Datei, daher müssen Sie es decodieren, um auf die Originaldatei zugreifen zu können. Wenn Sie die Python-Bibliothek verwenden möchten, wird dies wahrscheinlich für Sie erledigt. Mir ist keine Möglichkeit zum Herunterladen von Verzeichnissen bekannt, aber Sie können dies tun, indem Sie den Projektbaum wie folgt manuell abrufen: https://gitlab.com/api/v4/projects/12949323/repository/tree?path=fonts/Lato und benötigte Dateien einzeln herunterladen. Auch dies wäre mit der Python-Bibliothek einfacher. All dies finden Sie in der API-Dokumentation.
– ja2142
9. Juli 2019 um 15:36 Uhr
Um die andere Antwort zu erweitern, ist es (jetzt? Ich weiß nicht, wann diese Funktion hinzugefügt wurde) möglich, nur eine Rohdatei anstelle eines JSON mit einer Base64-Codierung der Datei zu erhalten.
Beachten Sie, dass in dem Beispiel der vollständige Pfad zur Datei URL-codiert ist und zu path/to/file.foo führt
Das dritte %2F wurde als %2E typisiert
– trotten
27. Juli 2021 um 17:31 Uhr
das “dritte %2F” ist tatsächlich ein %2E, was ein Punkt ist. im Beispiel ist es file.foo, nicht file/foo.
– Christian W
29. Juli 2021 um 18:06 Uhr
Was bringt es, %2F und %2E in der URL anstelle von / und zu verwenden? ?
– Durchsichtiger Coder
25. Oktober 2021 um 21:27 Uhr
/ und . sind reservierte Zeichen in URLs. Wenn Sie sie also in einem anderen Kontext verwenden müssen (wie wir es hier tun, wollen wir einen Dateipfad beschreiben), müssen Sie sie codieren. Sehen en.wikipedia.org/wiki/Percent-encoding
– Christian W
10. November 2021 um 9:16 Uhr
Rubén Pozo
Verwenden von python-gitlab:
#!/usr/bin/python3
import gitlab
import sys
def download_file(host, token, project_name, branch_name, file_path, output):
try:
gl = gitlab.Gitlab(host, private_token=token)
pl = gl.projects.list(search=project_name)
for p in pl:
if p.name == project_name:
project = p
break
with open(output, 'wb') as f:
project.files.raw(file_path=file_path, ref=branch_name, streamed=True, action=f.write)
except Exception as e:
print("Error:", e)
num_arguments = len(sys.argv)
if num_arguments < 6:
print('Usage: ./download-gitlab-file.py host token project_name branch_name file_path output')
else:
download_file(
sys.argv[1],
sys.argv[2],
sys.argv[3],
sys.argv[4],
sys.argv[5],
sys.argv[6]
)
Mögliches Duplikat von How to sparsely checkout only one single file from a git repository?
– Thomas Weller
8. Juli 2019 um 22:44 Uhr
@ThomasWeller es ist ein anderes Problem.
– Benutzer9409752
8. Juli 2019 um 23:05 Uhr