使用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 。