@@ -400,6 +400,25 @@ func (r *Repository) DeleteRemote(name string) error {
400
400
return r .Storer .SetConfig (cfg )
401
401
}
402
402
403
+ func (r * Repository ) resolveToCommitHash (h plumbing.Hash ) (plumbing.Hash , error ) {
404
+ obj , err := r .Storer .EncodedObject (plumbing .AnyObject , h )
405
+ if err != nil {
406
+ return plumbing .ZeroHash , err
407
+ }
408
+ switch obj .Type () {
409
+ case plumbing .TagObject :
410
+ t , err := object .DecodeTag (r .Storer , obj )
411
+ if err != nil {
412
+ return plumbing .ZeroHash , err
413
+ }
414
+ return r .resolveToCommitHash (t .Target )
415
+ case plumbing .CommitObject :
416
+ return h , nil
417
+ default :
418
+ return plumbing .ZeroHash , errors .New ("Unable to resolve to commit" )
419
+ }
420
+ }
421
+
403
422
// Clone clones a remote repository
404
423
func (r * Repository ) clone (ctx context.Context , o * CloneOptions ) error {
405
424
if err := o .Validate (); err != nil {
@@ -415,7 +434,7 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {
415
434
return err
416
435
}
417
436
418
- head , err := r .fetchAndUpdateReferences (ctx , & FetchOptions {
437
+ ref , err := r .fetchAndUpdateReferences (ctx , & FetchOptions {
419
438
RefSpecs : r .cloneRefSpec (o , c ),
420
439
Depth : o .Depth ,
421
440
Auth : o .Auth ,
@@ -431,6 +450,11 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {
431
450
return err
432
451
}
433
452
453
+ head , err := r .Head ()
454
+ if err != nil {
455
+ return err
456
+ }
457
+
434
458
if err := w .Reset (& ResetOptions {Commit : head .Hash ()}); err != nil {
435
459
return err
436
460
}
@@ -445,7 +469,7 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {
445
469
}
446
470
}
447
471
448
- return r .updateRemoteConfigIfNeeded (o , c , head )
472
+ return r .updateRemoteConfigIfNeeded (o , c , ref )
449
473
}
450
474
451
475
const (
@@ -520,12 +544,12 @@ func (r *Repository) fetchAndUpdateReferences(
520
544
return nil , err
521
545
}
522
546
523
- head , err := storer .ResolveReference (remoteRefs , ref )
547
+ resolvedRef , err := storer .ResolveReference (remoteRefs , ref )
524
548
if err != nil {
525
549
return nil , err
526
550
}
527
551
528
- refsUpdated , err := r .updateReferences (remote .c .Fetch , head )
552
+ refsUpdated , err := r .updateReferences (remote .c .Fetch , resolvedRef )
529
553
if err != nil {
530
554
return nil , err
531
555
}
@@ -534,26 +558,30 @@ func (r *Repository) fetchAndUpdateReferences(
534
558
return nil , NoErrAlreadyUpToDate
535
559
}
536
560
537
- return head , nil
561
+ return resolvedRef , nil
538
562
}
539
563
540
564
func (r * Repository ) updateReferences (spec []config.RefSpec ,
541
- resolvedHead * plumbing.Reference ) (updated bool , err error ) {
565
+ resolvedRef * plumbing.Reference ) (updated bool , err error ) {
542
566
543
- if ! resolvedHead .Name ().IsBranch () {
567
+ if ! resolvedRef .Name ().IsBranch () {
544
568
// Detached HEAD mode
545
- head := plumbing .NewHashReference (plumbing .HEAD , resolvedHead .Hash ())
569
+ h , err := r .resolveToCommitHash (resolvedRef .Hash ())
570
+ if err != nil {
571
+ return false , err
572
+ }
573
+ head := plumbing .NewHashReference (plumbing .HEAD , h )
546
574
return updateReferenceStorerIfNeeded (r .Storer , head )
547
575
}
548
576
549
577
refs := []* plumbing.Reference {
550
- // Create local reference for the resolved head
551
- resolvedHead ,
578
+ // Create local reference for the resolved ref
579
+ resolvedRef ,
552
580
// Create local symbolic HEAD
553
- plumbing .NewSymbolicReference (plumbing .HEAD , resolvedHead .Name ()),
581
+ plumbing .NewSymbolicReference (plumbing .HEAD , resolvedRef .Name ()),
554
582
}
555
583
556
- refs = append (refs , r .calculateRemoteHeadReference (spec , resolvedHead )... )
584
+ refs = append (refs , r .calculateRemoteHeadReference (spec , resolvedRef )... )
557
585
558
586
for _ , ref := range refs {
559
587
u , err := updateReferenceStorerIfNeeded (r .Storer , ref )
0 commit comments