2016-09-23 4 views
1

Ich habe die Antwort in diesem Beitrag (libgit2 (fetch & merge & commit)) angeschaut, aber ich habe Schwierigkeiten, einen Git Pull zur Arbeit zu bekommen. Ich bekomme keine Fehlermeldungen. Der Abruf scheint zu funktionieren, aber die Zusammenführung tritt nicht auf. Doing ein Git-Status zeigt, dass mein Zweig hinter der 1. begehen ...Doing a Git Ziehen mit libgit2

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 

Mein Code ist unten ...

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(); 
} 

Was ich das verursacht die Zusammenführung tue nicht zu arbeiten?

Antwort

1

Erstens hat git_checkout_options.checkout_strategy einen eher überraschenden Standard. Es ist standardmäßig auf Trockenlauf eingestellt. Sie möchten es wahrscheinlich in etwas wie GIT_CHECKOUT_SAFE ändern.

Die zweite Sache zu verstehen ist, dass git_merge nicht tatsächlich die Zusammenführung festlegt. Es richtet nur Ihr Arbeitsverzeichnis und Index für eine Zusammenführung ein. Sie müssen noch nach Konflikten suchen und git_commit_create aufrufen, um die Zusammenführung zu beenden.

Es sieht jedoch so aus, als müssten Sie in diesem speziellen Fall nicht wirklich zusammenführen. Ihre Filiale kann schnell weitergeleitet werden. Rufen Sie git_merge_analysis auf, um festzustellen, welche Art von Zusammenführung durchgeführt werden soll. Zum schnellen Vorlauf des Anrufs git_reference_set_target auf dem aktuellen Zweig mit dem neuen Abrufkopf.

+0

Danke Jason. Ich habe deinen Vorschlag ausprobiert, einen Commit zu machen. Ich gebe sowohl den lokalen als auch den entfernten Zweig als Eltern an, aber es lässt den lokalen Repo einen Commit vor dem Remote, was nicht mit einem "Git-Pull" passiert. – Anthony

+0

Der lokale Zweig * sollte * nach dem Zusammenführen eine Commit voraus sein. Allerdings habe ich nicht erkannt, dass Sie nicht wirklich zusammenführen müssen, weil Sie Ihre lokale Geschichte nicht von der Remote-Geschichte abweichen. Sie können schnell vorspulen. Ich werde meine Antwort entsprechend aktualisieren. –