code: def filter_and_date(local_root, conf_rel_paths, commits):
      
      dates_paths = dict()
  
      # Filter without docs.
      for commit in commits:
          if commit in dates_paths:
              continue
          command = ['git', 'ls-tree', '--name-only', '-r', commit] + conf_rel_paths
          try:
              output = run_command(local_root, command)
          except CalledProcessError as exc:
              raise GitError('Git ls-tree failed on {0}'.format(commit), exc.output)
          if output:
              dates_paths[commit] = [None, output.splitlines()[0].strip()]
  
      # Get timestamps by groups of 50.
      command_prefix = ['git', 'show', '--no-patch', '--pretty=format:%ct']
      for commits_group in chunk(dates_paths, 50):
          command = command_prefix + commits_group
          output = run_command(local_root, command)
          timestamps = [int(i) for i in RE_UNIX_TIME.findall(output)]
          for i, commit in enumerate(commits_group):
              dates_paths[commit][0] = timestamps[i]
  
      # Done.
      return dates_paths
docs: Get commit Unix timestamps and first matching conf.py path. Exclude commits with no conf.py file.
  
      :raise CalledProcessError: Unhandled git command failure.
      :raise GitError: A commit SHA has not been fetched.
  
      :param str local_root: Local path to git root directory.
      :param iter conf_rel_paths: List of possible relative paths (to git root) of Sphinx conf.py (e.g. docs/conf.py).
      :param iter commits: List of commit SHAs.
  
      :return: Commit time (seconds since Unix epoch) for each commit and conf.py path. SHA keys and [int, str] values.
      :rtype: dict