2014-07-11 3 views
0

with pygit2 인 경우 마지막 단계는 Repository.checkout() 또는 Repository.checkout_head()을 사용하여 계산하는 것입니다. 어떤 것을 사용합니까?pygit2의 Repository.checkout()과 Repository.checkout_head()의 차이점은 무엇입니까?

이 두 가지 모두 인수 전략으로 사용됩니다. 이제 GIT_CHECKOUT_SAFE, GIT_CHECKOUT_SAFE_CREATE, GIT_CHECKOUT_FORCE를 확인하기위한 몇 가지 전략이 있습니다. etc.
내가 직면하고있는 문제는 인덱스 파일을 체크 아웃 한 후에도 파일이 수정된다는 것입니다. 즉, 몇 개의 파일이 준비되어 있습니다.

r.repo.status()
{ 'README.md는': 2}

GIT_CHECKOUT_FORCE는 인덱스 전략을 사용하여 빈과 커밋이다 또한 저장됩니다.

GIT_CHECKOUT_FORCE 전략을 사용해야하는시기는 언제입니까?
다음은 프로세스의 단계별 코드입니다.
r.repo은 리포지토리 개체입니다. remo 이름 ssh-sansa

>>> r.repo.status() 
{} 
>>> z = remo.fetch() 
>>> remoref = r.repo.lookup_reference('refs/remotes/ssh-sansa/master') 
>>> rref = r.repo.lookup_reference(r.ref) 
>>> r.ref 
'refs/heads/master' 
>>> remoref.target.hex 
'23aac24f65c775d0524095d422133c63caf3826a' 
>>> rref.target.hex 
'29f5f99722e9c93a58ec085a55c6a4814c4adffb' 
>>> rref.target=remoref.target.hex 
>>> rref.target.hex 
'23aac24f65c775d0524095d422133c63caf3826a' 
>>> r.repo.status() 
{'README.md': 2} 
>>> r.repo.checkout_head(repo_.pygit2.GIT_CHECKOUT_SAFE_CREATE) 
>>> r.repo.status() 
{'README.md': 2} 
>>> r.repo.checkout('HEAD',strategy=repo_.pygit2.GIT_CHECKOUT_SAFE_CREATE) 
>>> r.repo.status() 
{'README.md': 2} 
>>> r.repo.checkout('HEAD',strategy=repo_.pygit2.GIT_CHECKOUT_FORCE) 
>>> r.repo.status() 
{} 

참고로 원격 :이 차이가 없습니다 pulling and integrating changes using pygit2another question here

답변

0

에 대한 후속 질문입니다. refname'HEAD'Repository.checkout()에 전달하면 Repository.checkout_head()이 호출됩니다.

파일이 수정 된 이유는 라이브러리에 변경 사항을 덮어 쓰지 않도록했기 때문입니다. 각 전략의 역할에 대한 설명은 the strategy docs을 참조하십시오. 구체적으로,

그 사이에는 GIT_CHECKOUT_SAFE와 GIT_CHECKOUT_SAFE_CREATE가 있으며, 둘 다 변경 내용을 잃지 않도록 수정합니다.

파일이 수정됨에 따라 파일을 덮어 쓰면 변경 사항이 없어져서 거부됩니다. 덮어 쓰려면 FORCE을 사용하거나 파일이 수정 된 상태가되지 않게하십시오.

+0

'Reference.target = '이후 커밋 히스토리가 변경되었습니다 (이제는 커밋이 너무 커지기도하고 리모트에서 변경된 내용이 파일에 나타납니다). 변경 사항이 손실됩니까? – avck

+0

** libgit2에서 checkout은 대상 트리와 일치하도록 작업 디렉토리와 색인을 업데이트하는 데 사용됩니다. ** 원격에서 당긴 후 대상 트리는 무엇이 될까요? – avck

+0

잃어버린 변경 사항은 상태가 당신에게 말하는 README.txt입니다. 현재 브랜치를 변경하는 것은 정상적인 (이 경우 상태가 더 이상 동의하지 않음) 및 무언가가 실패 할 경우 쉽게 롤백 할 수있는 ** 마지막 ** 작업입니다. –