用 nodegit 切换 Branch/Tag
Switch Branch/Tag with nodegit
我整个上午都在尝试使用 nodegit 打开一个现有的 repo 并更改分支或标签。该文档很广泛,但似乎已过时。关于我做错了什么的想法?
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 only 更新您的工作目录以反映指向的树第二个参数.
第三,您将一个字符串传递给一个期待其他东西的方法。 The docs 显示它正在寻找 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 channel。
以下完整解决方案适用于标签,可以是轻量级或带注释的标签:(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。
我整个上午都在尝试使用 nodegit 打开一个现有的 repo 并更改分支或标签。该文档很广泛,但似乎已过时。关于我做错了什么的想法?
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 only 更新您的工作目录以反映指向的树第二个参数.
第三,您将一个字符串传递给一个期待其他东西的方法。 The docs 显示它正在寻找 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 channel。
以下完整解决方案适用于标签,可以是轻量级或带注释的标签:(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。