使用rugged
如何执行以下操作:fetch
,pull
和rebase
?
我正在使用development
分支,并在审核其文档found here后作为Remote
课程的指南。
编辑:由于git pull
只是git fetch
和git merge FETCH_HEAD
的简写,因此更好的问题是如何执行git fetch
,{{1 }和git merge
。
答案 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