2017-05-10 6 views
4

とGitチェックアウト は、』支店名コミットしていないなどの特定への参照で複製する。 『(コミット)(コミット)Gitのチェックアウト「私はコマンドの動作を再現しようとしていますPyGit2

を使用している場合このコマンドでは、リポジトリのHEADがコミット(分離ヘッド)と作業ディレクトリを指しています。

現時点では、リポジトリがPyGit2を使ってコミットを指す:

def go(self, repo_name, version): 
    repo = pygit2.Repository(bdd[repo_name]) 
    #commit = repo.revparse_single(version) 
    #repo.reset(version, pygit2.GIT_RESET_HARD) 
    repo.set_head(pygit2.Oid(hex=version)) 
    print repo.head_is_detached 

私の問題は、Git CLIのように作業ディレクトリをロールバックする方法が見つからないということです。 私が使用してみました:

  • repo.checkout_head():それは作業ディレクトリに何もしていません。
  • repo.checkout():クラッシュGitError: X conflicts prevent checkout

ではRepository.reset(ref, pygit2.GIT_RESET_HARD)を使用せずに、この動作を複製する方法はありますか?

+0

'repo.checkout()'を実行する前に、作業ディレクトリがクリーンですか? –

+0

@NilsWerner私はコミットを指すようにHEADを変更した後、 'repo.checkout()'を実行しようとしています。この時点で、作業ディレクトリには最後にコミットされたものがすべて含まれているので、作業ディレクトリはHEADの観点からはきれいではありません。 – Maeln

+0

'set_head()'と 'checkout()'を組み合わせないでください(ワークスペースが汚れてしまいます)。ちょうど 'checkout()'を使ってください。 –

答えて

2

低レベルのチェックアウトはgit read-tree -um HEAD $target && git update-ref HEAD $target;です。pygit2は、1つのツリーの読み取りとそれに対するオプションは明らかに分かりませんが、チェックアウトやマージなど、粗いモック以上の機能はありません実際のgitのアップ。あなたのコミットを参照してそれを確認し、それをチェックしてからHEADをリセットし、refを削除して、それをkludgeできるように見えます。

関連する問題