diff --git a/remote.go b/remote.go index 80604092a..f4a14718b 100644 --- a/remote.go +++ b/remote.go @@ -623,7 +623,11 @@ func getHaves( } err = getHavesFromRef(ref, remoteRefs, s, haves) - if err != nil { + + // Take care of the edge case where iterating using Preorder over + // commits produces an `object not found` error, if using a shallow + // clone with incomplete history. + if err != nil && err != plumbing.ErrObjectNotFound { return nil, err } } diff --git a/remote_test.go b/remote_test.go index 58a05983f..86d2c7030 100644 --- a/remote_test.go +++ b/remote_test.go @@ -3,6 +3,7 @@ package git import ( "bytes" "context" + "fmt" "io" "io/ioutil" "os" @@ -55,6 +56,37 @@ func (s *RemoteSuite) TestFetchInvalidFetchOptions(c *C) { c.Assert(err, Equals, config.ErrRefSpecMalformedSeparator) } +func (s *RemoteSuite) TestFetchUnrelated(c *C) { + fmt.Println(fixtures.RootFolder) + mem := memory.NewStorage() + r1 := newRemote(mem, &config.RemoteConfig{ + URLs: []string{s.GetBasicLocalRepositoryURL()}, + }) + r2 := newRemote(mem, &config.RemoteConfig{ + URLs: []string{s.GetLocalRepositoryURL(fixtures.ByTag("tags").One())}, + }) + + // Fetch both repos into the same storage but under different remote names. + s.testFetch(c, r1, &FetchOptions{ + RefSpecs: []config.RefSpec{ + config.RefSpec("+refs/heads/master:refs/remotes/r1/master"), + }, + Depth: 1, + }, []*plumbing.Reference{ + plumbing.NewReferenceFromStrings("refs/remotes/r1/master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5"), + }) + s.testFetch(c, r2, &FetchOptions{ + RefSpecs: []config.RefSpec{ + config.RefSpec("+refs/heads/master:refs/remotes/r2/master"), + }, + Depth: 1, + }, []*plumbing.Reference{ + plumbing.NewReferenceFromStrings("refs/remotes/r1/master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5"), + plumbing.NewReferenceFromStrings("refs/remotes/r2/master", "f7b877701fbf855b44c0a9e86f3fdce2c298b07f"), + }) + +} + func (s *RemoteSuite) TestFetchWildcard(c *C) { r := newRemote(memory.NewStorage(), &config.RemoteConfig{ URLs: []string{s.GetBasicLocalRepositoryURL()},