Делаем Git Pull с помощью libgit2

Я посмотрел на ответ в этом посте (libgit2 (выборка & сливаться & фиксации)) но я изо всех сил пытаюсь заставить Git Pull работать. Я не получаю сообщений об ошибках. Выборка работает, но слияние не происходит. Выполнение статуса Git показывает, что моя ветвь отстает на 1 коммит …

On branch Branch_1_1.
Your branch is behind 'origin/Branch_1_1' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working directory clean

Мой код ниже …

static int fetchhead_ref_cb(const char *name, const char *url,
const git_oid *oid, unsigned int is_merge, void *payload)

{
if ( is_merge )
{
strcpy_s( branchToMerge, 100, name );
memcpy( &branchOidToMerge, oid, sizeof( git_oid ) );
}
return 0;
}

void GitPull()
{
git_libgit2_init();

git_repository *repo = NULL;
git_remote *remote;

int error = git_repository_open( &repo, "C:\\work\\GitTestRepos\\Repo1" );
CHECK_FOR_ERROR

error = git_remote_lookup( &remote, repo, "origin" );
CHECK_FOR_ERROR

git_fetch_options options = GIT_FETCH_OPTIONS_INIT;
error = git_remote_fetch( remote, NULL, &options, NULL );
CHECK_FOR_ERROR

git_repository_fetchhead_foreach( repo, fetchhead_ref_cb, NULL );

git_merge_options merge_options = GIT_MERGE_OPTIONS_INIT;
git_checkout_options checkout_options = GIT_CHECKOUT_OPTIONS_INIT;
git_annotated_commit *heads[ 1 ];
git_reference *ref;

error = git_annotated_commit_lookup( &heads[ 0 ], repo, &branchOidToMerge );
CHECK_FOR_ERROR
error = git_merge( repo, (const git_annotated_commit **)heads, 1, &merge_options, &checkout_options );
CHECK_FOR_ERROR

git_annotated_commit_free( heads[ 0 ] );
git_repository_state_cleanup( repo );
git_libgit2_shutdown();
}

Что я делаю, что слияние не работает?

3

Решение

Первый, git_checkout_options.checkout_strategy имеет довольно удивительный дефолт. По умолчанию работает всухую. Таким образом, вы, вероятно, хотите изменить его на что-то вроде GIT_CHECKOUT_SAFE,

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

Тем не менее, похоже, что вам не нужно объединяться в этом конкретном случае. Ваш филиал может быть быстро продвинут. Вызов git_merge_analysis определить, какой вид слияния делать. Переадресация вызова git_reference_set_target на текущей ветке с новой головой выборки.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]