2017-05-10 5 views
4

내가 명령의 동작을 복제하려고와 자식 체크 아웃 을"복제 자식 체크 아웃 "여기서 (커밋)과 같은 특정 커밋에 대한 참조가 아닌 분기 이름입니다. 는 "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는 분명히 하나의 트리 읽기와 그 옵션에 대한 옵션을 전혀 이해하지 못하기 때문에 체크 아웃 및 병합을 비롯하여 조잡한 모의 (mock) 실제 자식 - 최대. 커밋에 대한 참조를 추가하고 체크 아웃 한 다음 HEAD를 다시 설정하고 참조를 삭제하면 커질 수 있습니다.