0

我正在尝试将 repo 克隆到本地文件系统,然后签出特定的提交。
这就是我所拥有的:

Git.Clone(GIT_REPO_URL, localPath, CLONE_OPTIONS).then((repo) => {
    return repo.getCommit(version).then((commit) => {
        // use the local tree
    });
}).catch((error) => {
    // handler clone failure
});

这很好地克隆了 repo,但我最终得到的本地版本是 master 的当前负责人,而不是我签出的提交 ( version)。

如何更新本地树以匹配此提交?
谢谢。

4

3 回答 3

3

getCommit不修改本地树;它只是在脚本中检索内存中的提交,因此您可以在不修改本地树的情况下使用它。(例如,如果您想浏览 git 历史记录并进行一些分析,但不需要实际更新本地树来访问文件本身,这将很有用。)

要实际检查特定分支或提交,您需要使用checkoutBranchandcheckoutRef函数,它实际上会更新本地工作树。(请注意他们的描述是如何明确说明的,不像getCommit,它没有说它修改了工作三个,因为它实际上并没有这样做)。

于 2017-03-07T15:43:23.417 回答
1

如果要签出随机提交,则需要改用该Checkout.tree(*)函数。

var repository;
NodeGit.Clone(GIT_REPO_URL, localPath, CLONE_OPTIONS)
.then(function(repo) {
    repository = repo;
    return repo.getCommit(version);
})
.then(function(commit) {
    return NodeGit.Checkout.tree(repository, commit, checkoutStrategy:
      git.Checkout.STRATEGY.FORCE
    });
}).catch((error) => {
    // handler clone failure
});

您可能也可能不想分离您的HEAD.

编辑:这将结帐并设置HEAD为有问题的提交。

var repository;
NodeGit.Clone(GIT_REPO_URL, localPath, CLONE_OPTIONS)
.then(function(repo) {
    repository = repo;
    return repo.getCommit(version);
})
.then(function(commit) {
    repository.setHeadDetached(commit.id());
}).catch((error) => {
    // handler clone failure
});
于 2017-03-14T11:21:09.857 回答
0

我还没有设法让它发挥作用,而且事实证明它太复杂了,无法让一些琐碎的事情发挥作用,我决定这样做:

import * as process from "child_process";

const command = `git clone ${ GIT_REPO_URL } ${ repoPath } && cd ${ repoPath } && git checkout ${ version }`;
process.exec(command, error => {
    ...
});
于 2017-03-14T14:21:21.820 回答