使用nodegit切换分支/标记

我一直试图打开一个现有的repo,并使用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. }); }); }); 

所以你的代码中缺less一些东西。 首先是你没有终止承诺链,所以错误被吞噬了。 你可以用.catch.done来结束它。

其次,我认为你不太清楚结账是做什么的。 其中一个令人困惑的事情与低级别的git,以及它与git CLI的不同之处在于,Checkout 只会更新您的工作目录以反映第二个参数指向的树。

第三,你正在传递一个string给一个期待别的东西的方法。 文档显示它正在查找Oid,树,提交或引用。 让我们来修饰一下这个代码。

 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 }); 

这应该指向正确的方向。 如果你需要更多的帮助,我会build议停止我们的gitter频道 ,我们非常活跃。

下面的完整解决scheme适用于我的标签,它可以是轻量级标签或注释标签:( repo是一个开放的存储库, tag是要签出的标签的名称)

 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()); }) }); } 

通过使用repo.getReferenceCommit()可能会更容易,但是此命令当前对注释标记失败。 请参阅跟踪此问题的https://github.com/nodegit/nodegit/issues/1370