You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:10:31