docs: def commit(
              self,
              message: str,
              files_to_add: typing.Optional[typing.Union[typing.List[str], str]] = None,
              allow_empty: bool = False,
      ):
          """
          Commits changes to the repo
  
          :param message: first line of the message
          :type message: str
          :param files_to_add: files to commit
          :type files_to_add: optional list of str
          :param allow_empty: allow dummy commit
          :type allow_empty: bool
          """
          message = str(message)
          LOGGER.debug('message: %s', message)
  
          files_to_add = self._sanitize_files_to_add(files_to_add)
          LOGGER.debug('files to add: %s', files_to_add)
  
          if not message:
              LOGGER.error('empty commit message')
              sys.exit(-1)
  
          if os.getenv('APPVEYOR'):
              LOGGER.info('committing on AV, adding skip_ci tag')
              message = self.add_skip_ci_to_commit_msg(message)
  
          if files_to_add is None:
              self.stage_all()
          else:
              self.reset_index()
              self.stage_subset(*files_to_add)
  
          if self.index_is_empty() and not allow_empty:
              LOGGER.error('empty commit')
              sys.exit(-1)
  
          self.repo.index.commit(message=message)