在GitHub Actions中获取仓库文件创建时间的可行性确认
结论:你的推理完全正确
当GitHub Action运行时,仓库代码会被克隆到Docker容器的文件系统中,这个过程会生成全新的文件副本——副本的创建时间就是它被写入容器的时间,和原仓库中文件的实际创建时间完全无关。用Python的os.path.getctime()或类似方法拿到的,必然是容器内的复制时间,而非你需要的原仓库时间。
替代方案:通过Git提交记录获取真实时间
仓库中文件的"实际创建时间"本质上是它首次被提交到Git仓库的时间,你可以通过Git命令来获取这个时间,再在Python脚本中调用这些命令实现。
获取文件首次提交时间(即仓库内创建时间)
以下是Python脚本示例,通过调用git log命令获取文件的首次提交时间:
import subprocess from datetime import datetime def get_git_file_creation_time(file_path): try: # 执行git log命令,获取所有提交的时间戳(倒序) log_output = subprocess.check_output( ["git", "log", "--follow", "--format=%at", "--", file_path], text=True, stderr=subprocess.STDOUT ) # 拆分时间戳列表,取最后一个(最早的提交) timestamps = log_output.strip().split("\n") if not timestamps: return None first_commit_timestamp = int(timestamps[-1]) return datetime.fromtimestamp(first_commit_timestamp) except subprocess.CalledProcessError: # 文件不存在或无提交记录时返回None return None # 使用示例 target_file = "your_file.py" creation_time = get_git_file_creation_time(target_file) if creation_time: print(f"文件在仓库中的创建时间:{creation_time}") else: print(f"无法获取文件 {target_file} 的创建时间")
获取文件最后修改时间(仓库内最新提交时间)
如果需要文件的最后修改时间,可简化命令:
def get_git_file_last_modified_time(file_path): try: timestamp = subprocess.check_output( ["git", "log", "-1", "--format=%at", "--", file_path], text=True, stderr=subprocess.STDOUT ).strip() return datetime.fromtimestamp(int(timestamp)) except subprocess.CalledProcessError: return None
注意事项
- GitHub Action的运行环境默认已经完成仓库克隆,无需额外执行
git clone操作,可直接调用Git命令。 --follow参数用于追踪文件重命名历史,如果文件曾被重命名,仍能正确获取首次提交时间。
内容的提问来源于stack exchange,提问作者monte
相关产品推荐
相关产品推荐

