使用rugged
如何执行以下操作fetch
:pull
和rebase
?
我正在使用该development
分支,并在查看了此处找到的文档作为Remote
课程指南之后。
编辑:因为git pull
只是简写,git fetch
更好git merge FETCH_HEAD
的问题是如何执行git fetch
,git merge
和git rebase
.
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
的),但我们还没有。
上面的答案似乎已经过时了。语法已更改。我需要实现一个拉动操作,我试图通过提取然后合并和提交来完成。对于获取,我使用这样的 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