code: func (o *FSObject) Reader() (io.ReadCloser, error) {
  	obj, ok := o.cache.Get(o.hash)
  	if ok && obj != o {
  		reader, err := obj.Reader()
  		if err != nil {
  			return nil, err
  		}
  
  		return reader, nil
  	}
  
  	f, err := o.fs.Open(o.path)
  	if err != nil {
  		return nil, err
  	}
  
  	p := NewPackfileWithCache(o.index, nil, f, o.cache)
  	r, err := p.getObjectContent(o.offset)
  	if err != nil {
  		_ = f.Close()
  		return nil, err
  	}
  
  	if err := f.Close(); err != nil {
  		return nil, err
  	}
  
  	return r, nil
  }
docs: // Reader implements the plumbing.EncodedObject interface.