code: def load_recursive(self, path: Optional[Path] = None):
      path = path or self.root_dir
      for ignore_file in self.ignore_files:
          ignore_file = path / ignore_file
          if ignore_file.exists():
              self.load_ignore_file(
                  str(path.relative_to(self.root_dir)), ignore_file
              )
  
      for subdir in path.iterdir():
          if not subdir.is_dir() or self.ignore(
              subdir.relative_to(self.root_dir)
          ):
              continue
          self.load_recursive(subdir)
  
file_path: dstack/src/dstack/_internal/utils/ignore.py
imports: import fnmatch
  from itertools import zip_longest
  from pathlib import Path
  from typing import Dict, List, Optional
  from dstack._internal.utils.path import PathLike
label_desc: Use image node_id 3 for calling the GitIgnore obj's underlying member method code with example usage: obj.load_recursive(path) without return types