如何修改Git脚本提取分支提交信息及领先状态并导出至CSV
解决方案:获取Bitbucket分支信息并导出CSV
方案一:基于Git命令的本地脚本(适合已克隆仓库)
如果已经把Bitbucket仓库克隆到本地,直接用Git命令就能批量提取所有字段,以下是调整后的完整Bash脚本:
#!/bin/bash # 初始化CSV表头 echo "分支名称,最后提交ID,最后提交开发者,最后提交日期,最后提交消息,是否领先master" > branch_details.csv # 遍历所有本地分支(要处理远程分支的话,把下面一行换成 git branch -r | grep -v HEAD | sed 's/origin\///') for branch in $(git branch | sed 's/* //'); do # 静默切换到目标分支,避免干扰当前工作区 git checkout -q $branch # 提取各字段信息 commit_id=$(git rev-parse --short HEAD) developer=$(git log -1 --pretty=format:"%an") commit_date=$(git log -1 --pretty=format:"%ci") # 处理提交消息的换行和逗号,避免破坏CSV格式 commit_message=$(git log -1 --pretty=format:"%s" | tr '\n' ' ' | tr ',' ';') # 判断是否领先master:统计分支比master多的提交数 ahead_count=$(git rev-list --count master..$branch) ahead_status="是" if [ $ahead_count -gt 0 ] else "否" # 写入CSV,用双引号包裹字段防止格式错乱 echo "\"$branch\",\"$commit_id\",\"$developer\",\"$commit_date\",\"$commit_message\",\"$ahead_status\"" >> branch_details.csv done # 切回原来的分支 git checkout -q $(git rev-parse --abbrev-ref HEAD) echo "导出完成,文件:branch_details.csv"
脚本说明
- 分支遍历:默认处理本地分支,要处理远程分支的话,替换分支遍历的命令,同时可以用
git show origin/$branch相关命令获取信息,无需切换分支。 - CSV兼容:对提交消息的换行、逗号做了替换,所有字段用双引号包裹,避免CSV解析出错。
- 领先判断:通过
git rev-list --count master..$branch统计分支独有的提交数,大于0则标记为“是”。
方案二:Bitbucket API远程实现(无需克隆仓库)
如果不想克隆仓库,直接用Bitbucket的REST API远程拉取数据,适合批量处理多个仓库,以下是Python脚本示例:
import requests import csv from datetime import datetime # 配置你的Bitbucket信息 USERNAME = "你的Bitbucket用户名" APP_PASSWORD = "你的Bitbucket应用密码" WORKSPACE = "仓库所在工作区名称" REPO_SLUG = "仓库的slug(URL里的短名称)" BASE_API = f"https://api.bitbucket.org/2.0/repositories/{WORKSPACE}/{REPO_SLUG}" auth = (USERNAME, APP_PASSWORD) headers = {"Accept": "application/json"} # 获取所有分支 branches = [] next_page = f"{BASE_API}/refs/branches" while next_page: res = requests.get(next_page, headers=headers, auth=auth) res.raise_for_status() data = res.json() branches.extend(data["values"]) next_page = data.get("next") # 获取master分支的最新提交哈希 master_res = requests.get(f"{BASE_API}/refs/branches/master", headers=headers, auth=auth) master_res.raise_for_status() master_hash = master_res.json()["target"]["hash"] # 写入CSV with open("branch_info_api.csv", "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=[ "分支名称", "最后提交ID", "最后提交开发者", "最后提交日期", "最后提交消息", "是否领先master" ]) writer.writeheader() for branch in branches: commit = branch["target"] # 格式化日期和提交消息 commit_date = datetime.strptime(commit["date"], "%Y-%m-%dT%H:%M:%S%z").strftime("%Y-%m-%d %H:%M:%S") clean_msg = commit["message"].replace("\n", " ").replace(",", ";") # 调用API对比分支与master的提交差异 compare_res = requests.get(f"{BASE_API}/compare/{master_hash}..{commit['hash']}", headers=headers, auth=auth) compare_res.raise_for_status() ahead_count = compare_res.json().get("ahead", 0) writer.writerow({ "分支名称": branch["name"], "最后提交ID": commit["hash"][:7], "最后提交开发者": commit["author"]["user"]["display_name"], "最后提交日期": commit_date, "最后提交消息": clean_msg, "是否领先master": "是" if ahead_count > 0 else "否" }) print("API导出完成,文件:branch_info_api.csv")
注意事项
- Bash脚本需要在仓库目录下运行,确保本地Git环境正常。
- Python脚本需要先安装
requests库(pip install requests),并且要在Bitbucket后台创建带仓库读取权限的应用密码。
内容的提问来源于stack exchange,提问作者Benny Lenger
相关产品推荐
相关产品推荐

