@@ -371,14 +371,22 @@ func (r *Remote) addReferencesToUpdate(
371371 refspecs []config.RefSpec ,
372372 localRefs []* plumbing.Reference ,
373373 remoteRefs storer.ReferenceStorer ,
374- req * packp.ReferenceUpdateRequest ) error {
374+ req * packp.ReferenceUpdateRequest ,
375+ ) error {
376+ // This references dictionary will be used to search references by name.
377+ refsDict := make (map [string ]* plumbing.Reference )
378+ for _ , ref := range localRefs {
379+ refsDict [ref .Name ().String ()] = ref
380+ }
381+
375382 for _ , rs := range refspecs {
376383 if rs .IsDelete () {
377384 if err := r .deleteReferences (rs , remoteRefs , req ); err != nil {
378385 return err
379386 }
380387 } else {
381- if err := r .addOrUpdateReferences (rs , localRefs , remoteRefs , req ); err != nil {
388+ err := r .addOrUpdateReferences (rs , localRefs , refsDict , remoteRefs , req )
389+ if err != nil {
382390 return err
383391 }
384392 }
@@ -390,9 +398,21 @@ func (r *Remote) addReferencesToUpdate(
390398func (r * Remote ) addOrUpdateReferences (
391399 rs config.RefSpec ,
392400 localRefs []* plumbing.Reference ,
401+ refsDict map [string ]* plumbing.Reference ,
393402 remoteRefs storer.ReferenceStorer ,
394403 req * packp.ReferenceUpdateRequest ,
395404) error {
405+ // If it is not a wilcard refspec we can directly search for the reference
406+ // in the references dictionary.
407+ if ! rs .IsWildcard () {
408+ ref , ok := refsDict [rs .Src ()]
409+ if ! ok {
410+ return nil
411+ }
412+
413+ return r .addReferenceIfRefSpecMatches (rs , remoteRefs , ref , req )
414+ }
415+
396416 for _ , ref := range localRefs {
397417 err := r .addReferenceIfRefSpecMatches (rs , remoteRefs , ref , req )
398418 if err != nil {
0 commit comments