如何一次性获取Git指定文件夹所有文件创建时间及Python调用方法
批量获取Git仓库指定文件夹下文件创建时间方案
原生Git命令实现
你之前使用的单文件查询命令逻辑正确,批量查询可通过遍历指定目录下Git跟踪的文件列表,逐个匹配首次提交记录实现,可直接在终端执行以下命令:
# 将<目标文件夹路径>替换为需要查询的实际目录,支持相对路径/绝对路径 git ls-files <目标文件夹路径> | while read file; do create_time=$(git log --diff-filter=A --follow --format=%aD -- "$file" | tail -1) echo "$create_time | $file" done
命令逻辑说明:
git ls-files仅拉取指定目录下被Git纳入版本跟踪的文件列表,自动过滤未跟踪的本地临时文件- 逐文件读取后复用单文件查询逻辑,
--diff-filter=A仅匹配文件首次添加的提交记录,--follow会跟踪文件重命名历史,避免把重命名操作误判为文件创建时间 - 默认输出RFC2822格式的时间,若需要更易程序解析的格式,可将
%aD替换为%aI(带时区的ISO8601标准格式)或%at(Unix时间戳)
Python脚本实现
直接使用Python标准库subprocess调用Git命令即可,无需安装第三方依赖,示例代码如下:
import subprocess from pathlib import Path def get_dir_git_create_time(target_dir: str | Path): """ 查询指定目录下所有Git跟踪文件的首次提交创建时间 :param target_dir: 待查询的目标文件夹路径 :return: 字典结构,key为文件相对仓库根目录的路径,value为ISO8601格式的创建时间 """ target_dir = str(Path(target_dir).resolve()) # 获取目标目录下所有Git跟踪文件列表 ls_proc = subprocess.run( ["git", "ls-files", target_dir], capture_output=True, text=True, check=True ) file_list = [line.strip() for line in ls_proc.stdout.splitlines() if line.strip()] create_time_map = {} for file_path in file_list: # 查询单个文件的首次提交记录 log_proc = subprocess.run( ["git", "log", "--diff-filter=A", "--follow", "--format=%aI", "--", file_path], capture_output=True, text=True, check=True ) # 取最后一条记录即为文件最早创建时间 create_time_map[file_path] = log_proc.stdout.splitlines()[-1].strip() return create_time_map # 调用示例 if __name__ == "__main__": time_map = get_dir_git_create_time("./src") # 替换为实际目标目录 for file_path, create_time in time_map.items(): print(f"{create_time} | {file_path}")
使用注意:
- 脚本默认在当前工作目录识别Git仓库,若需要指定仓库位置,可在所有
subprocess.run调用中传入cwd="你的仓库根目录路径"参数 - 若不需要跟踪文件重命名历史,可删除命令中的
--follow参数,大幅提升大仓库的查询速度 - 若需要Unix时间戳格式结果,将
--format=%aI替换为--format=%at,读取结果后转整数即可使用
内容的提问来源于stack exchange,提问作者Dhanush Amruth
相关产品推荐
相关产品推荐

