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