// Push has the same effect as 'git push origin master' func Push(repo *git.Repository) error { remoteRepo, err := repo.LoadRemote("origin") if err != nil { return err } defer remoteRepo.Free() err = remoteRepo.SetPushRefspecs([]string{MasterRef + ":" + MasterRef}) if err != nil { return err } credCallBack := &git.RemoteCallbacks{} credCallBack.CredentialsCallback = getCredentials err = remoteRepo.SetCallbacks(credCallBack) if err != nil { return err } err = remoteRepo.Save() if err != nil { return err } pushObj, err := remoteRepo.NewPush() if err != nil { return err } defer pushObj.Free() err = pushObj.AddRefspec(MasterRef + ":" + MasterRef) if err != nil { return err } err = pushObj.Finish() if err != nil { return err } ok := pushObj.UnpackOk() if !ok { return errors.New("objects from push not unpacked properly") } StatusForEachCallback := func(ref string, msg string) int { if msg != "" { return -1 } return 0 } err = pushObj.StatusForeach(StatusForEachCallback) if err != nil { return err } sig, err := getSignatureFromLastCommit(repo) if err != nil { return err } err = pushObj.UpdateTips(sig, "update by push") return nil }