2014-02-18 2 views
4

rugged выполняет следующие операции: fetch, pull и rebase?Прочный - выбор, вытащить бэкап можно?

Я использую ветку development и рассмотрев ее документацию found here в качестве руководства к классу Remote.

EDIT: Поскольку git pull просто сокращение для git fetch и git merge FETCH_HEAD тем лучше вопрос заключается в том, чтобы выполнить git fetch, git merge и git rebase.

ответ

11

мерзавец выборки:

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: "[email protected]" }, 
    committer: { name: "User", email: "[email protected]" }, 
    update_ref: 'master' 
}) 

GIT перебазироваться:

перебазирования еще не был реализован в libgit2, и, таким образом, не доступны в Rugged.


В общем, ваш случай использования звучит очень высокий уровень, в то время как прочный API в настоящее время немного больше сосредоточены на низком уровне мерзавца доступа к хранилищу и модификации. В конце концов, в будущем у нас также будет много помощников более высокого уровня (например, более простой/правильный pull), но мы пока не находимся.

+0

Спасибо за это - будет следить за захватывающими изменениями! На данный момент это достаточно хорошо. – rhodee

+0

'Rugged :: Branches' больше не существует в текущей версии прочной. – thesecretmaster

4

Ответ выше, кажется, устарел. Синтаксис изменился. Мне нужно реализовать действие pull, которое я пытаюсь выполнить с помощью fetch, а затем слияние и фиксация. Для выборки я использую метод выборки, как этот

repo.fetch('origin', [repo.head.name], credentials: credits) 

И это, кажется, на самом деле получить что-то, так как возвращаемый хэш полон информацией о том, что было неправдоподобным. Однако он не записывается на диск. Я ожидал бы, что ветка останется за несколькими коммитами, когда я буду указывать статус в командной строке, но это не так. Если я выберу второй раз с той же командой выше, ничего не будет извлечено. Вероятно, это потому, что он уже был получен в первый раз, но потом я не вижу, где находится выборка.

Теперь, если я идти вперед и делать выборки вручную в командной строке, а затем попытаться объединить локальную копию удаленного филиала и местное отделение (локальные изменения уже зафиксированы), используя следующий код

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

Update 1

Это приведет мое рабочее дерево в нужное состояние

repo.checkout ref_name, strategy: :force 

Update2

Я узнал, как извлечь и сохранить состояние на диск

r = repo.remotes[remote] 
r.fetch(credentials: git_credentials) 
r.save