code: func lsTreeBlobs(ref string, filter *filepathfilter.Filter) (*TreeBlobChannelWrapper, error) {
  	cmd, err := git.LsTree(ref)
  	if err != nil {
  		return nil, err
  	}
  
  	cmd.Stdin.Close()
  
  	blobs := make(chan TreeBlob, chanBufSize)
  	errchan := make(chan error, 1)
  
  	go func() {
  		scanner := newLsTreeScanner(cmd.Stdout)
  		for scanner.Scan() {
  			if t := scanner.TreeBlob(); t != nil && filter.Allows(t.Filename) {
  				blobs <- *t
  			}
  		}
  
  		stderr, _ := ioutil.ReadAll(cmd.Stderr)
  		err := cmd.Wait()
  		if err != nil {
  			errchan <- fmt.Errorf("Error in git ls-tree: %v %v", err, string(stderr))
  		}
  		close(blobs)
  		close(errchan)
  	}()
  
  	return NewTreeBlobChannelWrapper(blobs, errchan), nil
  }
docs: // Use ls-tree at ref to find a list of candidate tree blobs which might be lfs files
  // The returned channel will be sent these blobs which should be sent to catFileBatchTree
  // for final check & conversion to Pointer