2

此问题类似,但我没有创建新文件,而是尝试从原点合并。Rugged::Repository使用's创建新索引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: 'user@foo.com', time: Time.now},
     author: {name: 'user', email: 'user@foo.com', time: Time.now},
     parents: [repo.head.target, origin_target],
     message: "merge `origin/master` into `master`"}

并确保使用合并索引中的树。

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

创建提交

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

检查我们的 HEAD 是否已更新:

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

看起来不错。我在索引中看到了新文件。将其写入磁盘。

> repo.index.write
=> nil

...但 git 将新文件报告为已删除:

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

如何正确更新我的索引和工作树?

4

1 回答 1

1

Git 存储库和工作目录之间有一个重要的区别。虽然最常见的命令行 git 命令在工作目录和存储库上运行,但 libgit2 / librugged 的​​低级命令大多只在存储库上运行。这包括按照您的示例编写索引。

要更新工作目录以匹配索引,以下命令应该可以工作(在写入索引之后):

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

checkout_head 的文档:http ://www.rubydoc.info/github/libgit2/rugged/Rugged/Repository#checkout_head-instance_method

注意:我测试update_ref: 'HEAD'了提交。我不确定是否update_ref: 'refs/heads/master'会产生相同的效果。

于 2015-01-27T10:15:03.960 回答