news 2026/3/31 8:28:30

git提取当前分支指定文件历史版本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
git提取当前分支指定文件历史版本

git提取当前分支指定文件历史版本

场景:排查某个文件变化历史

import os import subprocess # ================= 配置 ================= # 注意:前面加 r 是为了防止报错,保持不动 TARGET_FILE = r"C://test//a.txt" # 提取多少个版本 COUNT = 5 # 导出到哪个文件夹 (会自动创建在当前脚本目录下) OUTPUT_DIR = "history_versions" # ======================================= def run_cmd(cmd, cwd): """ cmd: git 命令 cwd: 执行命令的目录 (关键修复点) """ # 这里的 cwd 参数告诉 Python:去那个文件夹里运行 git return subprocess.check_output(cmd, shell=True, cwd=cwd).decode('utf-8').strip() def main(): if not os.path.exists(TARGET_FILE): print(f"❌ 找不到文件: {TARGET_FILE} (请检查路径)") return # 1. 自动获取目标文件所在的目录 # Git 命令必须在这个目录下(或其父目录)运行,才能找到 .git 仓库 repo_work_dir = os.path.dirname(TARGET_FILE) # 2. 准备输出目录 if not os.path.exists(OUTPUT_DIR): os.makedirs(OUTPUT_DIR) print(f"📂 切换工作目录至: {repo_work_dir}") print(f"🔍 正在查找最近 {COUNT} 次修改记录...") # 3. 获取日志 # 注意:cmd 里依然使用绝对路径的文件名,这样最稳妥 cmd_log = f'git log -n {COUNT} --pretty=format:"%h|%ad|%s" --date=format:"%Y%m%d_%H%M%S" -- "{TARGET_FILE}"' try: # 关键修改:把 repo_work_dir 传进去 logs = run_cmd(cmd_log, repo_work_dir).split('\n') except subprocess.CalledProcessError as e: print("\n❌ Git 执行失败!可能是因为该目录不是 Git 仓库,或者没有安装 Git。") print(f"错误信息: {e}") return for i, log in enumerate(logs): if not log: continue try: commit_hash, date, msg = log.split('|') except ValueError: continue # 跳过格式不对的行 # 4. 构造导出文件名 ext = os.path.splitext(TARGET_FILE)[1] # 清洗文件名中的非法字符 safe_msg = "".join([c for c in msg if c.isalnum() or c in " -_"])[:30] out_name = f"v{i + 1}_{date}_{commit_hash}_{safe_msg}{ext}" out_path = os.path.join(OUTPUT_DIR, out_name) # 5. 提取文件内容 # 使用 git show hash:绝对路径 (Windows下可能需要转义,这里最简单的办法是只给文件名,由 cwd 控制上下文) # 但为了稳妥,我们使用 git show hash:./文件名 (相对路径) 或者处理一下路径 # 技巧:git show <hash>:<path> 需要 path 是相对于仓库根目录的路径。 # 直接用绝对路径在 git show <hash>:... 中经常会报错。 # 最稳妥的方法是:git show <hash> -- <绝对路径> 这样通常打印不出来内容到stdout # 替代方案:既然我们已经在工作区了,用 git show <hash>:<文件名> (相对路径) file_name_only = os.path.basename(TARGET_FILE) # 尝试获取相对于 git 根目录的路径(这是最严谨的写法) try: git_root = run_cmd("git rev-parse --show-toplevel", repo_work_dir).replace('/', '\\') rel_path = os.path.relpath(TARGET_FILE, git_root).replace('\\', '/') except: # 如果获取失败,尝试直接用文件名(仅当文件在根目录时有效,这步是保底) rel_path = file_name_only cmd_show = f'git show {commit_hash}:"{rel_path}"' try: content = run_cmd(cmd_show, repo_work_dir) with open(out_path, 'w', encoding='utf-8') as f: f.write(content) print(f"✅ 已导出: {out_name}") except Exception as e: print(f"⚠️ 导出 {commit_hash} 失败。可能原因:路径转义问题或文件在该版本不存在。") print(f" 尝试命令: {cmd_show}") print("-" * 30) print(f"🎉 完成!文件已保存在脚本所在目录的 '{OUTPUT_DIR}' 文件夹中。") if __name__ == "__main__": main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 5:16:51

PicSharp:重新定义图片压缩体验的高性能跨平台解决方案

PicSharp&#xff1a;重新定义图片压缩体验的高性能跨平台解决方案 【免费下载链接】PicSharp A simple, efficient and flexible cross-platform desktop image compression application. 项目地址: https://gitcode.com/gh_mirrors/pi/PicSharp 作为一名经常需要处理大…

作者头像 李华
网站建设 2026/3/27 7:36:51

ZyPlayer终极体验:5个隐藏技巧让免费观影更精彩

ZyPlayer终极体验&#xff1a;5个隐藏技巧让免费观影更精彩 【免费下载链接】ZyPlayer 跨平台桌面端视频资源播放器,免费高颜值. 项目地址: https://gitcode.com/gh_mirrors/zy/ZyPlayer 在众多跨平台视频播放器中&#xff0c;ZyPlayer以其免费高颜值的特性脱颖而出&…

作者头像 李华
网站建设 2026/3/29 3:34:20

鸿蒙远程投屏效能革命:破解跨设备开发难题的智能解决方案

鸿蒙远程投屏效能革命&#xff1a;破解跨设备开发难题的智能解决方案 【免费下载链接】鸿蒙远程真机工具 该工具主要提供鸿蒙系统下基于视频流的投屏功能&#xff0c;帧率基本持平真机帧率&#xff0c;达到远程真机的效果。 项目地址: https://gitcode.com/OpenHarmonyToolki…

作者头像 李华
网站建设 2026/3/27 11:13:15

终极指南:如何在浏览器中轻松查看CAD图纸

终极指南&#xff1a;如何在浏览器中轻松查看CAD图纸 【免费下载链接】three-dxf A dxf viewer for the browser using three.js 项目地址: https://gitcode.com/gh_mirrors/th/three-dxf Three.js DXF查看器是一款革命性的工具&#xff0c;让您能够在浏览器中直接显示和…

作者头像 李华
网站建设 2026/3/27 15:33:33

Snap2HTML完整指南:一键生成交互式目录网页的终极解决方案

Snap2HTML完整指南&#xff1a;一键生成交互式目录网页的终极解决方案 【免费下载链接】Snap2HTML Generates directory listings contained in a single, app-like HTML files 项目地址: https://gitcode.com/gh_mirrors/sn/Snap2HTML 想要快速将硬盘目录结构转换为美观…

作者头像 李华