【问题标题】:Rugged - fetch, pull rebase possible?坚固 - 获取,拉变基可能吗?
【发布时间】:2014-02-18 01:42:49
【问题描述】:

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

我正在使用development 分支,并在查看其文档found here 作为Remote 类的指南之后。

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

【问题讨论】:

    标签: ruby git rugged


    【解决方案1】:

    git 获取:

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

    git 合并:

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

    【讨论】:

    • 感谢您的支持 - 将密切关注令人兴奋的变化!现在这已经足够了。
    • Rugged::Branches 不再存在于当前版本的加固版中。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 2017-02-21
      • 2011-06-14
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多