Ich versuche, etwas zu implementieren, das mir das Ergebnis git pull
oder git fetch && git merge
geben wird. Ich habe das funktioniert teilweise, aber das Problem, das ich habe, ist, dass nach dem Ausführen des folgenden Codes, der aktuelle Repo ist zu denken, dass es lokale Änderungen zu verpflichten sind.Git2go - pull && Merge
Soweit ich sehen kann, glaube ich, dass ich das kommentierte Commit wahrscheinlich nicht vom richtigen HEAD erstelle oder ich noch ein Commit machen muss? (Ich bin nicht sicher).
Mein Code sieht wie folgt aus, und ich bin fest:
func (repo *Repo) Pull() error {
// Get remote
remote, err := repo.Remotes.Lookup("origin")
if err != nil {
remote, err = repo.Remotes.Create("origin", repo.Path())
if err != nil {
return err
}
}
// Get the branch
branch, err := repo.Branch()
if err != nil {
return err
}
// Get the name
branchName, err := branch.Name()
if err != nil {
return err
}
if err := remote.Fetch([]string{}, &git.FetchOptions{}, ""); err != nil {
return err
}
// Merge
remoteRef, err := repo.References.Lookup("refs/remotes/origin/" + branchName)
if err != nil {
return err
}
mergeRemoteHead, err := repo.AnnotatedCommitFromRef(remoteRef)
if err != nil {
return err
}
mergeHeads := make([]*git.AnnotatedCommit, 1)
mergeHeads[0] = mergeRemoteHead
if err = repo.Merge(mergeHeads, nil, nil); err != nil {
return err
}
return nil
}
Nachdem es läuft, ich die Änderungen bekommen von entfernten verschmolzen und das Arbeitsverzeichnis aktualisiert, aber es sagt mir, ich brauche, um ein Commit zu machen.
Ich denke, ich habe ein ähnliches Problem wie das OP von this question.
Können Sie ein wenig darüber, warum ich ein Commit erstellen müssen? Dies sind eingehende Änderungen von "Herkunft". Sollten sie inszeniert werden? Sollte es nicht nur diese Änderungen wiederholen und mir ein sauberes Arbeitsverzeichnis hinterlassen (vorausgesetzt, dass wir keine Änderungen vor Ort vorgenommen haben). Diese Funktion setzt Änderungen, die nicht lokal vorgenommen wurden, und zeichnet keine von Remote heruntergezogenen Commits auf. – Sthe
libgit2 (und seine Bindungen) arbeiten auf einer niedrigeren Ebene als die git (Porzellan) -Befehlszeile. Insbesondere macht git2go 'Merge' viel weniger als' git merge'. Während 'git merge' standardmäßig dazu in der Lage ist, Merges zu beschleunigen (was in Wirklichkeit gar keine Merges sind, siehe' --ff'), erzeugt git2go's 'Merge' explizit eine Zusammenführung, selbst wenn es ein Schnellvorlauf war möglich. Eine Zusammenführung erstellt wiederum immer eine Zusammenführungs-Festschreibung, und um etwas festzulegen, muss der Index ausgefüllt werden. Auch hier ist git2gos 'Merge' weitaus low-level und erfordert, dass Sie explizit committen, auch wenn keine Konflikte bestehen. – sschuberth