code: def traverse_commits(self) -> Generator[Commit, None, None]:
          
  
          if isinstance(self._path_to_repo, str):
              self._path_to_repo = [self._path_to_repo]
  
          for path_repo in self._path_to_repo:
              # if it is a remote repo, clone it first in a temporary folder!
              if self._isremote(path_repo):
                  tmp_folder = tempfile.TemporaryDirectory()
                  path_repo = self._clone_remote_repos(tmp_folder.name,
                                                       path_repo)
  
              git_repo = GitRepository(path_repo)
  
              self._sanity_check_filters(git_repo)
              self._check_timezones()
  
              logger.info('Analyzing git repository in %s', git_repo.path)
  
              if self._filepath is not None:
                  self._filepath_commits = git_repo.get_commits_modified_file(
                      self._filepath)
  
              for commit in git_repo.get_list_commits(self._only_in_branch,
                                                      not self._reversed_order):
                  logger.info('Commit #%s in %s from %s', commit.hash,
                              commit.committer_date,
                              commit.author.name)
  
                  if self._is_commit_filtered(commit):
                      logger.info('Commit #%s filtered', commit.hash)
                      continue
  
                  yield commit
docs: Analyze all the specified commits (all of them by default), returning
          a generator of commits.