2017-03-07 19 views
0

私はローカルファイルシステムにレポをクローンし、特定のコミットをチェックアウトしようとしています。
は、これは私が持っているものです。コミットバージョンでローカルパスを更新するにはどうすればよいですか?

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 
}); 

これはレポがうまくクローンが、私はで終わるローカルバージョンはマスターの現在のヘッドであると私は(version)チェックアウトコミットしていません。

このコミットと一致するようにローカルツリーを更新するにはどうすればよいですか?
ありがとうございます。

+0

コミットをチェックアウトする必要はありませんか?それは 'getCommit'とは何ですか?しかし、それはあなたを孤立した頭の状態に置くでしょう... – evolutionxbox

+0

@evolutionxboxええ、それは[getCommit](http://www.nodegit.org/api/repository/#getCommit)が対象ですが、そうではないようですローカルツリーを変更して関数の引数として渡してください。私の質問は、それをローカルツリーを更新する方法ですか? –

+0

ちょっと役立つヒント:適切なエラー処理のために、 'repo.getCommit(...)'チェーンによって与えられた約束を返したいと思うでしょう。今のように、たとえばgetCommitエラーハンドラ自体で発生するエラーは処理されず、プログラムがクラッシュする可能性があります。 – Frxstrem

答えて

3

getCommitローカルツリーは変更されません。スクリプト内のメモリのコミットを取得するだけで、ローカルツリーを変更せずに作業することができます。 (例えば、gitの履歴を調べて分析したいが、ファイル自体にアクセスするためにローカルツリーを実際に更新する必要がない場合に便利です)

実際にはをチェックアウトしてください特定のブランチまたはコミットの場合、実際にローカルの作業ツリーを更新するcheckoutBranchおよびcheckoutRef関数を使用します。 (実際にはそれをしないので、働く3つを変更するとは言わないgetCommitとは異なり、その記述が明示的にそう言っていることに注意してください)。

+0

'checkoutBranch'と' checkoutRef'を使う方法を知っていますか? [reference](http://www.nodegit.org/api/reference/)を作成する必要があるようですが、コミットバージョンのためにこれを行う方法は明確ではありません –

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 
}); 
+0

これは有望そうでしたが、ローカルツリーはまだ'マスター' –

0

は、私はそれを動作させるために管理していない、それが動作するように些細な何かを得るためにあまりにも複雑であることが判明したとして、私はこれを行うことにしました:

import * as process from "child_process"; 

const command = `git clone ${ GIT_REPO_URL } ${ repoPath } && cd ${ repoPath } && git checkout ${ version }`; 
process.exec(command, error => { 
    ... 
}); 
関連する問題