Sto cercando di implementare qualcosa che mi darà il risultato di git pull
o git fetch && git merge
. Ho ottenuto questo lavoro in parte, ma il problema che sto avendo è che dopo aver eseguito il seguente codice, il repository corrente viene lasciato a pensare che ci sono modifiche locali da impegnare.Git2go - pull && unione
Per quanto posso vedere, credo che probabilmente non sto creando il commit annotato dal HEAD corretto o ho bisogno di fare un altro commit? (Non sono sicuro).
Il mio codice simile a questo e io sono bloccato:
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
}
Dopo l'esecuzione, ottengo le modifiche da remoto dalla fusione e la directory di lavoro aggiornati, ma mi dice che ho bisogno di fare un commit.
Penso di avere un problema simile all'OP di this question.
Potresti elaborare un po 'sul motivo per cui devo creare un commit? Queste sono le modifiche in arrivo da 'origine'. Dovrebbero essere messi in scena? Non dovrebbe semplicemente riprodurre queste modifiche e lasciarmi con una directory di lavoro pulita (dato che non abbiamo apportato modifiche localmente). Questa funzione mette in scena le modifiche non apportate localmente e non registra i commit estratti dal telecomando. – Sthe
libgit2 (e le sue associazioni) operano su un livello inferiore rispetto alla linea di comando git (porcellana). In particolare, il 'Merge' di git2go fa molto meno che' git merge'. Mentre 'git merge' di default è in grado di semplificare le unioni veloci (che di fatto non sono affatto unioni, si veda' --ff'), 'Merge' di git2go crea esplicitamente un'unione, anche se un avanzamento veloce era possibile. Un'unione a sua volta crea sempre un merge commit e, al fine di eseguire il commit di qualcosa, l'indice deve essere compilato. Ancora una volta Git2go's Merge è molto più di basso livello e richiede di impegnarsi esplicitamente anche se non ci sono conflitti. – sschuberth