2014-11-14 12 views

Antwort

16

Die offizielle Vergleich API begehen ist Compare two commits:

GET /repos/:owner/:repo/compare/:base...:head 

Beide :base und :head können entweder Zweig Namen sein: Repo oder Zweignamen in anderen Repositories im gleichen Netzwerk wie :repo. Für den letzteren Fall, verwenden Sie das Format user:branch:

GET /repos/:owner/:repo/compare/user1:branchname...user2:branchname 

Beachten Sie, dass Sie Tags als auch nutzen können.
Zum Beispiel:

https://api.github.com/repos/git/git/compare/v2.2.0-rc1...v2.2.0-rc2

Beachten Sie die '...', nicht '..' zwischen den beiden Tags.
Und Sie müssen zuerst das älteste Tag haben, dann das neuere Tag.

, die einen Status gibt:

ABER

"files": [ 
    { 
     "sha": "bbcd538c8e72b8c175046e27cc8f907076331401", 
     "filename": "file1.txt", 
     "status": "added", 
     "additions": 103, 
     "deletions": 21, 
     "changes": 124, 
     "blob_url": "https://github.com/octocat/Hello-World/blob/6dcb09b5b57875f334f61aebed695e2e4193db5e/file1.txt", 
     "raw_url": "https://github.com/octocat/Hello-World/raw/6dcb09b5b57875f334f61aebed695e2e4193db5e/file1.txt", 
     "contents_url": "https://api.github.com/repos/octocat/Hello-World/contents/file1.txt?ref=6dcb09b5b57875f334f61aebed695e2e4193db5e", 
     "patch": "@@ -132,7 +132,7 @@ module Test @@ -1000,7 +1000,7 @@ module Test" 
    } 
    ] 
:

  • Die Antwort beinhaltet eine

    "status": "behind", 
        "ahead_by": 1, 
        "behind_by": 2, 
        "total_commits": 1, 
    

    Und für jede verpflichten, Informationen über die Dateien Vergleich von bis zu 250 Commits. Wenn Sie mit einem größeren Festschreibungsbereich arbeiten, können Sie die Commit List API verwenden, um alle Festlegungen in dem Bereich aufzuzählen.

  • Für Vergleiche mit extrem großen Diffs erhalten Sie möglicherweise eine Fehlerreaktion, die darauf hinweist, dass der Vergleich zu lange gedauert hat. Sie können diesen Fehler normalerweise beheben, indem Sie einen kleineren Festschreibungsbereich verwenden.

+4

Ich weiß das, aber: base und: head können Zweignamen sein, aber ich möchte nicht 2 Zweige Köpfe vergleichen. Ich möchte 2 spezifische Commits als Web-Beispiel vergleichen, das ich gab. – Unlink

+0

@Unlink dann bietet die API das nicht. Was Sie versuchen können, ist das Erstellen von Verzweigungen für diese Commits, aber das würde immer noch alle Commits zwischen den beiden vergleichen (Sie könnten jedoch Ihre beiden Commits isolieren) – VonC

+0

Und was, wenn ein Tag auf dieser Grundlage erstellt, kann es helfen? – Unlink

2

Untersuchung Antworten mit der offiziellen API kommt, kann man eine kaum erwähnt Weg finden diffs von Github zu bekommen. Versuchen Sie folgendes:

wget -H 'Accept: application/vnd.github.v3.diff' \ 
    http://github.com/github/linguist/compare/96d29b76...a20631af.diff 
    wget -H 'Accept: application/vnd.github.v3.diff' \ 
    http://github.com/github/linguist/compare/a20631af...96d29b76.diff 

Dies ist der Link als Beispiel zur Verfügung gestellt, mit .diff angehängt. Und der umgekehrte Unterschied von demselben.

Die angegebene Kopfzeile stellt sicher, dass die Anfrage von der Github v3 API gehandhabt wird. Das ist derzeit die Standardeinstellung, kann sich aber in Zukunft ändern. Siehe Media Types.

Warum zwei Downloads?

Github dient nur lineare Diffs von älteren zu neueren Versionen. Wenn das angeforderte Diff tatsächlich linear ist und von einer älteren zu einer neueren Version, ist der zweite Download leer.

Wenn das angeforderte Diff linear ist, aber von einer neueren zu einer älteren Version, ist der erste Download leer. Stattdessen ist das ganze Diff im zweiten Download. Je nachdem, was man erreichen möchte, kann man es normalerweise auf die neuere Version anwenden oder es auf die ältere Version umkehren (patch -R).

Wenn zwischen dem Paar angeforderter Commits keine lineare Beziehung besteht, werden beide Downloads mit Inhalten ungleich null beantwortet. Eine von der common anchestor zum ersten Commit und eine andere, umgekehrte von diesem gemeinsamen anchestor zum anderen commit. Wenn man eine Differenz normal und die andere umgekehrt anwendet, ergibt sich, was die Ausgabe von git diff 96d29b76..a20631af auch ergibt.

Soweit ich sagen kann, unterliegen diese Roh-Diffs nicht den API-Beschränkungen von Github. Anfragen nach 540 Commits mit 1002 Dateiänderungen verliefen einwandfrei.

Hinweis: Man kann auch .patch statt .diff anhängen. Dann erhält man immer noch eine große Datei, aber eine Reihe von individuellen Patches für jedes Commit in dieser Datei.

+0

PS .: Anstelle von SHAs kann man natürlich auch Tags oder Zweige oder Kombinationen von diesen anfordern. – Traumflug

+0

Bearbeiten Sie Ihren Beitrag, wenn Sie Ihrer Antwort etwas Nützliches hinzufügen möchten. – Badda

+0

Interessante Ergänzung zu meiner Antwort. +1 – VonC

Verwandte Themen