使用rugged
如何执行以下操作:fetch
、pull
和rebase
?
我使用的是development
分支,在查看了此处作为Remote
类指南的文档后。
EDIT:由于git pull
只是git fetch
和git merge FETCH_HEAD
的简写,因此更好的问题是如何执行git fetch
、git merge
和git rebase
。
git fetch:
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
),但我们还没有做到。
上面的答案似乎已经过时了。语法已更改。我需要实现一个pull操作,我正试图通过获取,然后合并和提交来实现这个操作。对于提取,我使用类似的提取方法
repo.fetch('origin', [repo.head.name], credentials: credits)
它似乎真的得到了一些东西,因为返回的哈希中充满了关于提取内容的信息。但是,它不会写入磁盘。当我在命令行中执行git状态时,我希望分支在几次提交之后,但事实并非如此。如果我用上面的相同命令第二次获取,那么什么都不会获取。这可能是因为它已经被第一次提取了,但我不知道提取在哪里。
现在,如果我继续在命令行中手动获取,然后尝试使用以下代码合并远程分支和本地分支的本地副本(本地更改已经提交)
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