2015-04-10 11 views
10

Ich habe den ganzen Morgen versucht, eine bestehende Repo zu öffnen und ändern Zweig oder Tag mit nodegit. Die Dokumentation ist umfangreich, scheint aber veraltet zu sein. Irgendwelche Ideen, was ich falsch mache?Switch Branch/Tag mit nodegit

var NodeGit = require("nodegit"); 
var open = NodeGit.Repository.open; 
var Tag = NodeGit.Tag; 
var Checkout = NodeGit.Checkout; 

open(location).then(function (repo) { 
    Tag.list(repo).then(function(array) { 
     // array is ['v1.0.0'] 
     var ref = array[0] 
     Checkout.tree(repo, ref).then(function() { 
      // Want tag to be checked out out in detached state. 
     }); 
    }); 
}); 
+0

Sie haben nicht erläutert, was passiert, wenn Sie diesen Code ausführen. – Chris

+0

Nichts passiert - keine Fehler geworfen. Der Repo befindet sich momentan im Master-Zweig, nach dessen Ausführung befindet er sich noch im Master-Zweig. Ich möchte zum Tag v1.0.0 wechseln. – ngourley

Antwort

9

So, es gibt ein paar Dinge, die Sie mit Ihrem Code vermissen. Das erste ist, dass Sie die Verkündigungskette nicht beenden, so dass Fehler verschluckt werden. Sie möchten es entweder mit einem .catch oder einem .done beenden.

Zweitens, ich denke, Sie sind nicht ganz sicher, was eine Kasse tut. Eines der verwirrenden Dinge mit Low-Level-Git und wie es sich von Git CLI unterscheidet ist, dass Checkout nur Ihr Arbeitsverzeichnis aktualisiert, um den Baum widerzuspiegeln, auf den der zweite Parameter zeigt.

Drittens übergeben Sie eine Zeichenfolge an eine Methode, die etwas anderes erwartet. The docs zeigen, dass es nach einem Oid, Tree, Commit oder Reference sucht. Lassen Sie uns diesen Code etwas aufpeppen.

var NodeGit = require("nodegit"); 
var open = NodeGit.Repository.open; 
var Tag = NodeGit.Tag; 
var Checkout = NodeGit.Checkout; 

open(location).then(function (repo) { 
    return Tag.list(repo) 
    .then(function(array) { 
     // array is ['v1.0.0','v2.0.0'] 
     return Tag.lookup(repo,array[0]); 
    }) 
    .then(function(tag) { 
     return Checkout.tree(repo, tag.targetId(), { checkoutStrategy: Checkout.STRATEGY.SAFE_CREATE}) 
     .then(function() { 
      repo.setHeadDetached(tag.targetId(), repo.defaultSignature, "Checkout: HEAD " + tag.targetId()); 
     }); 
    }); 
}) 
.catch(function(error) { 
    // log error 
}); 

Das sollte Sie in die richtige Richtung weisen. Wenn Sie mehr Hilfe benötigen, würde ich empfehlen, durch unsere gitter channel zu stoppen, wo wir ziemlich aktiv sind.

+1

Das brachte mich zum Laufen und ich bekam Hilfe auf dem Gitter-Kanal. Danke für die Richtung! – ngourley

+6

Sie sollten Ihre Ergebnisse hier hinzufügen, StackOverflow ist ein Ort, um Wissen zu teilen, nicht nur technische Unterstützung: / –

0

Die folgende komplette Lösung funktioniert für mich nach Tags, die entweder leichte oder mit Anmerkungen versehen Tags können sein: (repo ist ein offenes Repository, tag der Name des Tags an der Kasse ist)

var Git = require("nodegit"); 

function checkOutTag(repo, tag) { 
    return Git.Reference 
     .dwim(repo, "refs/tags/" + tag) 
     .then(function (ref) { 
      return ref.peel(Git.Object.TYPE.COMMIT); 
     }) 
     .then(function (ref) { 
      return repo.getCommit(ref); 
     }) 
     .then(function (commit) { 
      return Git.Checkout 
      .tree(repo, commit, {checkoutStrategy: Git.Checkout.STRATEGY.SAFE}) 
      .then(function() { 
       return repo.setHeadDetached(commit, repo.defaultSignature, 
              "Checkout: HEAD " + commit.id()); 
      }) 
    }); 
} 

Es könnte einfacher sein, indem Sie repo.getReferenceCommit() verwenden, aber dieser Befehl schlägt derzeit für annotierte Tags fehl. Siehe auch https://github.com/nodegit/nodegit/issues/1370, die dieses Problem verfolgt.