Skip to content

Commit 6da5e59

Browse files
authored
Merge pull request go-git#158 from chrisgavin/fix-force-push-delete-reference
git: remote, Fix deleting references when force pushing.
2 parents 5bf939b + 711b703 commit 6da5e59

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

remote.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func (r *Remote) PushContext(ctx context.Context, o *PushOptions) (err error) {
126126
if o.Force {
127127
for i := 0; i < len(o.RefSpecs); i++ {
128128
rs := &o.RefSpecs[i]
129-
if !rs.IsForceUpdate() {
129+
if !rs.IsForceUpdate() && !rs.IsDelete() {
130130
o.RefSpecs[i] = config.RefSpec("+" + rs.String())
131131
}
132132
}

remote_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,31 @@ func (s *RemoteSuite) TestPushDeleteReference(c *C) {
558558
c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
559559
}
560560

561+
func (s *RemoteSuite) TestForcePushDeleteReference(c *C) {
562+
fs := fixtures.Basic().One().DotGit()
563+
sto := filesystem.NewStorage(fs, cache.NewObjectLRUDefault())
564+
565+
r, err := PlainClone(c.MkDir(), true, &CloneOptions{
566+
URL: fs.Root(),
567+
})
568+
c.Assert(err, IsNil)
569+
570+
remote, err := r.Remote(DefaultRemoteName)
571+
c.Assert(err, IsNil)
572+
573+
err = remote.Push(&PushOptions{
574+
RefSpecs: []config.RefSpec{":refs/heads/branch"},
575+
Force: true,
576+
})
577+
c.Assert(err, IsNil)
578+
579+
_, err = sto.Reference(plumbing.ReferenceName("refs/heads/branch"))
580+
c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
581+
582+
_, err = r.Storer.Reference(plumbing.ReferenceName("refs/heads/branch"))
583+
c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
584+
}
585+
561586
func (s *RemoteSuite) TestPushRejectNonFastForward(c *C) {
562587
fs := fixtures.Basic().One().DotGit()
563588
server := filesystem.NewStorage(fs, cache.NewObjectLRUDefault())

0 commit comments

Comments
 (0)