2017-02-21 6 views
1

Ich bin Neuling GitHub API, und ich habe nach einem automatisierten Weg gesucht, dass ich alle Commits eines bestimmten Repository in GitHub als "lokale Dateien" in meine Maschine herunterladen kann, aber ohne Erfolg .GitHub API, fetch Commits als lokale Dateien

Alle Ratschläge und Vorschläge werden sehr geschätzt.

+0

Was meinst du "lokale Dateien"? Auch in welcher Sprache hoffst du das zu tun? – peinearydevelopment

+0

Ich meinte, dass "lokale Dateien" die Commits in meiner Maschine zum Beispiel als "file.cpp" speichern. Ich mache das mit Shell-Skript. – Hex

+0

Wenn Sie den Repo klonen, werden bei einem Teil dieses Prozesses alle Commits in Ihre 'lokalen Dateien' übernommen. Die API gibt JSON-Objekte zurück. Immer noch nicht sicher, was Sie versuchen zu tun, warum, oder welche Sprache Sie versuchen, dies zu erreichen. – peinearydevelopment

Antwort

2

Sie können entweder:

  • einfach git clone die GitHub Repo: Sie werden die Dateien erhalten, indem der Standard-Zweig ausgecheckt und alle Commits im .git Unterordner
  • Oder get the archive link of a repo und dann curl Archiv sagte (aber nur den Repo-Gehalt erhalten wird, nicht „alle Commits“
  • Oder list the commits on a repo, mit dem ?path=a/file/path Argument Filter Commits sagte und erhalten nur diejenigen, für eine gegebene file.cpp
+0

Ich sehe, dass alle Commits mit dem Klonen der Repos abgerufen werden. Es scheint, dass die Verwendung von? Path = a/file/path die URL eines Commits und nicht die rohe Datei abruft. Ich könnte diff-Tool innerhalb .git-Verzeichnis verwenden, aber nicht sicher, ob ich die gesamte übergebene Datei als Raw-Datei speichern könnte. – Hex

+0

@Hex True, der '? Path =/a/file/path' würde die Dateien innerhalb eines Commits auflisten, aber das Feld 'rohe_url' enthält das Feld. – VonC

+0

Großartig, vielen Dank. – Hex

1

Wenn Sie list the commits auf einem Repo über Github API verwenden möchten, können Sie das folgende Bash-Skript verwenden, das über alle Commits iteriert und sie in eine einzige Datei in einem Stamm-JSON-Array schreibt.

Sie können Ihre eigenen jq Filter hinzufügen, wenn Sie bestimmte Felder oder Filter etwas anderes wählen wollen:

#!/bin/bash 

# change those vars : 
GITHUB_USER=google 
GITHUB_REPO=gson 
OUTPUT_FILE=commit_list.json 
GITHUB_ACCESS_TOKEN=123456789

loop=0 
index=1 
TMP_FILE=tmpfile.txt 
PER_PAGE=100 


rm -f $TMP_FILE 
echo "[]" > $OUTPUT_FILE 

while [ "$loop" -ne 1 ] 
do 
    URI="https://api.github.com/repos/$GITHUB_USER/$GITHUB_REPO/commits?page=$index&per_page=$PER_PAGE&access_token=$GITHUB_ACCESS_TOKEN" 
    data=`curl -s $URI` 

    # add some filter here if needed (for instance `echo "$data" | jq '[ .[].commit ]`) 
    filtered=`echo "$data"` 

    check=`echo "$filtered" | jq 'if (type=="array" and length>0) then "continue" else "stop" end'` 

    if [ "$check" == '"stop"' ]; then 
     loop=1 
    else 
     echo "$filtered" > $TMP_FILE 
     concat=`jq -s add $TMP_FILE $OUTPUT_FILE` 
     echo "$concat" > $OUTPUT_FILE 
     size=`jq '. | length' $OUTPUT_FILE` 
     echo "computed $index page - fetched total commit count of : $size" 
     index=$((index+1)) 
    fi 
done 

Dieses Skript benötigt jq und curl

Der Ausgang befindet sich in der Ausgabedatei commit_list.json, die eine ist Array aller commit JSON object:

# jq 'length' commit_list.json 
1329