繁体   English   中英

使用nodegit切换分支/标记

[英]Switch Branch/Tag with 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.
        });
    });
});

因此,您的代码中缺少一些内容。 首先是你没有终止承诺链,所以误吞了。 你想用.catch.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
});

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

以下完整的解决方案适用于标签,可以是轻量级或带注释的标签:( 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来跟踪此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM