使用nodegit切换分支/标记

ngo*_*ley 10 git node.js nodegit

我整个上午都在尝试打开现有的仓库并使用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.
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

joh*_*y81 11

因此,您的代码中缺少一些内容.首先是你没有终止承诺链,所以误吞了.你想用a .catch或a 来结束它.done.

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

第三,您将字符串传递给期望其他内容的方法.文档显示它正在寻找Oid,Tree,Commit或Reference.让我们稍微修改一下代码.

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
});
Run Code Online (Sandbox Code Playgroud)

这应该指向正确的方向.如果您需要更多帮助,我建议您在我们非常活跃的gitter频道停留.

  • 您应该考虑在此处添加您的发现,StackOverflow是一个分享知识的地方,而不仅仅是技术支持:/ (6认同)