this question과 비슷하지만 새 파일을 만드는 대신 원본에서 병합을 시도하고 있습니다. Rugged::Repository
의 merge_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
어떻게 제대로 내 인덱스와 작업 트리를 업데이트 할 수 있습니다?
'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