4

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

我正在使用该development分支,并在查看了此处找到的文档作为Remote课程指南之后。

编辑:因为git pull只是简写,git fetch更好git merge FETCH_HEAD的问题是如何执行git fetch,git mergegit rebase.

4

2 回答 2

11

git 获取:

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

混帐:

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的),但我们还没有。

于 2014-02-24T10:18:49.140 回答
4

上面的答案似乎已经过时了。语法已更改。我需要实现一个拉动操作,我试图通过提取然后合并和提交来完成。对于获取,我使用这样的 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

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

任何人都可以提供一个获取、合并、提交的工作示例吗?在撰写本文时,坚固耐用的版本是 0.22.0b3

更新 1

这将使我的工作树达到想要的状态

repo.checkout ref_name, strategy: :force

更新2

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

r = repo.remotes[remote]
r.fetch(credentials: git_credentials)
r.save
于 2014-12-04T09:31:58.503 回答