code: func revListShas(include, exclude []string, opt *ScanRefsOptions) (*StringChannelWrapper, error) {
  	scanner, err := git.NewRevListScanner(include, exclude, &git.ScanRefsOptions{
  		Mode:             git.ScanningMode(opt.ScanMode),
  		Remote:           opt.RemoteName,
  		SkipDeletedBlobs: opt.SkipDeletedBlobs,
  		SkippedRefs:      opt.skippedRefs,
  		Mutex:            opt.mutex,
  		Names:            opt.nameMap,
  	})
  
  	if err != nil {
  		return nil, err
  	}
  
  	revs := make(chan string, chanBufSize)
  	errs := make(chan error, 5) // may be multiple errors
  
  	go func() {
  		for scanner.Scan() {
  			sha := hex.EncodeToString(scanner.OID())
  			if name := scanner.Name(); len(name) > 0 {
  				opt.SetName(sha, name)
  			}
  			revs <- sha
  		}
  
  		if err = scanner.Err(); err != nil {
  			errs <- err
  		}
  
  		if err = scanner.Close(); err != nil {
  			errs <- err
  		}
  
  		close(revs)
  		close(errs)
  	}()
  
  	return NewStringChannelWrapper(revs, errs), nil
  }
docs: // revListShas uses git rev-list to return the list of object sha1s
  // for the given ref. If all is true, ref is ignored. It returns a
  // channel from which sha1 strings can be read.