坚固耐用 - 取出,拉动底板可能吗?

时间:2014-02-18 01:42:49

标签: ruby git rugged

使用rugged如何执行以下操作:fetchpullrebase

我正在使用development分支,并在审核其文档found here后作为Remote课程的指南。

编辑:由于git pull只是git fetchgit merge FETCH_HEAD的简写,因此更好的问题是如何执行git fetch,{{1 }和git merge

2 个答案:

答案 0 :(得分:11)

git fetch:

remote = Rugged::Remote.lookup(repo, "origin")
remote.connect(:fetch) do |r|
  r.download
  r.update_tips!
end

git merge:

merge_index = repo.merge_commits(
  Rugged::Branches.lookup(repo, "master").tip,
  Rugged::Branches.lookup(repo, "origin/master").tip
)

raise "Conflict detected!" if merge_index.conflicts?

merge_commit = Rugged::Commit.create(repo, {
  parents: [
    Rugged::Branches.lookup(repo, "master").tip,
    Rugged::Branches.lookup(repo, "origin/master").tip
  ],
  tree: merge_index.write_tree(repo),
  message: 'Merged `origin/master` into `master`',
  author:    { name: "User", email: "example@test.com" },
  committer: { name: "User", email: "example@test.com" },
  update_ref: 'master'
})

git rebase:

在libgit2中尚未实现重新绑定,因此在Rugged中不可用。


通常,您的用例听起来非常高,而坚固的API目前更侧重于低级别的git存储库访问和修改。最终,我们将来还会有许多更高级别的帮助者(比如更简单/更正确pull),但我们还没有。

答案 1 :(得分:4)

上面的答案似乎已经过时了。语法已更改。我需要实现一个pull动作,我试图通过fetch然后进行合并和提交。对于提取我使用像这样的提取方法

repo.fetch('origin', [repo.head.name], credentials: credits)

它实际上似乎得到了一些东西,因为返回的哈希已经充满了有关已经获取的内容的信息。但是,它不会写入磁盘。当我在命令行中执行git status时,我希望分支落后于几个提交,但事实并非如此。如果我使用上面的相同命令再次获取,则不会获取任何内容。这可能是因为它已经第一次被取出但是后来我看不到取出的位置。

现在,如果我继续在命令行中手动执行提取,然后尝试使用以下代码合并远程分支的本地副本和本地分支(已提交本地更改)

ref_name = repo.head.name                            # refs/heads/branchname
branch_name = ref_name.sub(/^refs\/heads\//, '')     # branchname
remote_name = "#{remote}/#{branch_name}"             # origin/branchname
remote_ref = "refs/heads/#{remote_name}"             # refs/heads/origin/branchname

local_branch = repository.branches[branch_name]
remote_branch = repository.branches[remote_name]

index = repo.merge_commits(local_branch.target, remote_branch.target)

options = {
  author:     { time: Time.now }.merge(author),
  committer:  { time: Time.now }.merge(committer),
  message:    'merged',
  parents:    [
    local_branch.target,
    remote_branch.target
  ],
  tree:       index.write_tree(repository),
  update_ref: 'HEAD'
}
Rugged::Commit.create repo, options

它按预期创建提交。提交也写入磁盘并在数据中可见。但由于某种原因,该分支现在已经未提交更改。本地文件内容未更改。我希望他们有获取提交的内容。

有人可以提供一个获取,合并,提交的工作示例吗?写这篇文章的版本是0.22.0b3

更新1

这会将我的工作树带到想要的状态

repo.checkout ref_name, strategy: :force

<强> UPDATE2

我发现了如何获取并将状态保存到磁盘

r = repo.remotes[remote]
r.fetch(credentials: git_credentials)
r.save