2015-01-15 2 views
1

this question과 비슷하지만 새 파일을 만드는 대신 원본에서 병합을 시도하고 있습니다. Rugged::Repositorymerge_commits을 사용하여 새 색인을 만들고 새 병합 커밋을하면 git은 (origin에서 오는) 새 파일을 삭제 된 것으로보고합니다. 원점에서의 병합 된 커밋이 작업 트리를 업데이트하지 않습니다.

병합 인덱스를 생성

,

> origin_target = repo.references['refs/remotes/origin/master'].target 
> merge_index = repo.merge_commits(repo.head.target, origin_target) 

새로운 병합 커밋

> options = { 
    update_ref: 'refs/heads/master', 
    committer: {name: 'user', email: '[email protected]', time: Time.now}, 
    author: {name: 'user', email: '[email protected]', time: Time.now}, 
    parents: [repo.head.target, origin_target], 
    message: "merge `origin/master` into `master`"} 

및 병합 인덱스에서 나무를 사용해야합니다.

> repo.head.target.tree 
=> #<Rugged::Tree:16816500 {oid: 16c147f358a095bdca52a462376d7b5730e1978e}>            
<"first_file.txt" 9d096847743f97ba44edf00a910f24bac13f36e2>              
<"second_file.txt" 8178c76d627cade75005b40711b92f4177bc6cfc>                
<"newfile.txt" e69de29bb2d1d6434b8b29ae775ad8c2e48c5391> 

좋아 보인다 :

> options[:tree] = merge_index.write_tree(repo) 

은 우리의 머리가 업데이트되었습니다

> merge_commit = Rugged::Commit.create(repo, options) 

확인을 커밋 만들기. 색인에 새 파일이 보입니다. 디스크에 기록하십시오.

> repo.index.write 
=> nil 

...하지만 자식 보고서 삭제 된 새 파일 :

$ git st 
## master...origin/master [ahead 2] 
D newfile.txt 

어떻게 제대로 내 인덱스와 작업 트리를 업데이트 할 수 있습니다?

+0

'repo.reset repo.head.target, : hard'를 호출하면 "delete"가 unstages되고, 다시 호출하면 깨끗한 작업 디렉토리로 돌아옵니다. 그래서 나는'repo.index.write'가 [docs]에 언급 된 내용에도 불구하고 작업 디렉토리를 쓰지 않는다는 것을 확인할 수 있습니다. (http://www.rubydoc.info/gems/rugged/0.21.3/Rugged/Index # write-instance_method). 그렇다면 작업 디렉토리를 어떻게 업데이트합니까? – occamsquattro

답변

0

Git 저장소와 작업 디렉토리 사이에는 중요한 구별이 있습니다. 대부분의 일반적인 명령 행 자식 명령은 저장소뿐만 아니라 작업 디렉토리에서도 작동하지만, libgit2/librugged의 하위 명령은 주로 저장소에서만 작동합니다. 여기에는 귀하의 예와 같이 색인 작성이 포함됩니다. http://www.rubydoc.info/github/libgit2/rugged/Rugged/Repository#checkout_head-instance_method

주 : checkout_head에 대한

options = { strategy: force } 
repo.checkout_head(options) 

문서 :

인덱스, 다음 명령 (인덱스를 작성 후) 작동합니다 일치하도록 작업 디렉토리를 업데이트하려면 나는에 대한 update_ref: 'HEAD' 테스트 범하다. update_ref: 'refs/heads/master'에 동일한 효과가 있는지 확실하지 않습니다.

관련 문제