使用nodegit切换分支/标签

11

我整个上午都在尝试使用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.
        });
    });
});

你还没有解释运行那段代码会发生什么。 - Chris
没有任何反应 - 没有抛出错误。该仓库目前在主分支上,在执行此操作后仍然在主分支上。我想切换到v1.0.0标签。 - ngourley
2个回答

13

你的代码可能有几个问题。首先,你没有终止Promise链,因此错误被忽略了。你需要使用.catch.done来结束它。

其次,我认为你对"checkout"的作用还不太清楚。在低级别的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频道来寻求帮助,我们在那里非常活跃。


1
这让我有了动力,我在 gitter 频道上得到了帮助。感谢指引! - ngourley
7
您应该考虑在这里添加您的发现。StackOverflow 是一个分享知识而不仅仅是提供技术支持的地方。:/ - Adonis K. Kakoulidis

1
以下完整的解决方案对我适用于标签,这些标签可以是轻量级标签或注释标签:(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,该问题正在跟踪中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接