Реализация «git pull» с помощью libgit2?

У меня есть относительно короткий Gist, который должен использовать libgit2 для эмуляции функциональности git pull команда. К сожалению, это не совсем работает.

В общем, фрагмент:

  • вызывает git_repository_open(), чтобы открыть репозиторий на диске
  • вызывает git_remote_load() для получения git_remote * удаленного устройства с именем "origin"
  • вызывает git_remote_connect() с флагом GIT_DIRECTION_FETCH
  • вызывает git_remote_download() для получения объектов с удаленного

Согласно git_remote_stats(), объекты действительно извлекаются. Но рабочий каталог не меняется, чтобы отразить последнюю фиксацию. Я попытался добавить:

git_checkout_head(repo, NULL);

... но это не имело значения.

Вход:

git checkout master

... в терминале приводит к следующему выводу:

Already on 'master'
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.

Как перемотать вперед?


person Nathan Osman    schedule 19.03.2013    source источник


Ответы (1)


Вы должны запустить git pull origin master

or

git fetch origin + git merge origin/master

Тогда вам нужна эквивалентная функция слияния libgit2.

функция слияния доступна в libgit2 v0.20

person linquize    schedule 19.03.2013
comment
На самом деле, есть ветка WIP (work in progress), содержащая функцию git_merge. Он кажется относительно зрелым, и в настоящее время я изучаю его использование. - person Nathan Osman; 19.03.2013
comment
что-нибудь новое по этому поводу? - person Tim Specht; 25.11.2013
comment
упомянуть libgit2 v0.20 - person linquize; 26.11.2013
comment
Это +/- правильно; однако вы должны быть осторожны в случаях, когда локальные ветки (т.е. master) отображаются на удаленные ветки с разными именами (например, если ваша локальная ветка master отображается на ветку devel на удаленном компьютере). Полная реализация pull в libgit2 также требует изучения конфигурация, чтобы получить сопоставление удаленных и локальных ветвей. - person tychoish; 02.09.2015