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

如何实现Bitbucket指定分支自动推送至GitHub?

实现Bitbucket到GitHub的分支自动同步

Bitbucket的Webhook确实只能指向URL,没法直接关联本地脚本,但你可以搭一个轻量HTTP服务来接收Bitbucket的Webhook触发请求,再在服务里执行同步脚本。整个流程是:Bitbucket指定分支有推送→触发Webhook发送请求到你的HTTP服务→服务执行同步脚本→将代码推送到GitHub。

具体步骤

1. 编写同步脚本

先写一个完成Bitbucket到GitHub同步的bash脚本,核心逻辑是拉取指定分支最新代码,再推送到GitHub对应分支。

示例脚本(保存为sync_repo.sh):

#!/bin/bash

# 本地仓库路径,需提前拉取Bitbucket和GitHub仓库
REPO_DIR="/path/to/your/local/repo"
TARGET_BRANCH="main" # 要同步的分支名称
GITHUB_REMOTE="github" # 提前添加的GitHub远程仓库别名(git remote add github <github-repo-url>)

cd $REPO_DIR || exit 1

# 拉取Bitbucket分支最新代码
git pull origin $TARGET_BRANCH

# 推送到GitHub对应分支
git push $GITHUB_REMOTE $TARGET_BRANCH

注意:提前在服务器上配置好SSH密钥(或HTTPS个人访问令牌),确保能免密拉取Bitbucket仓库、推送GitHub仓库。

2. 搭建HTTP服务接收Webhook

用Python Flask搭建轻量HTTP服务,用来接收Bitbucket的Webhook请求,验证合法性后执行同步脚本。

示例代码(保存为webhook_server.py):

from flask import Flask, request, abort
import subprocess
import hmac
import hashlib

app = Flask(__name__)

# 与Bitbucket Webhook设置一致的密钥,用于验证请求来源
WEBHOOK_SECRET = "your-custom-secret-key"
SYNC_SCRIPT_PATH = "/path/to/sync_repo.sh"

def validate_bitbucket_request(request):
    signature_header = request.headers.get('X-Hub-Signature')
    if not signature_header:
        return False
    sha_type, signature = signature_header.split('=')
    if sha_type != 'sha256':
        return False
    # 计算请求体的签名并对比
    computed_signature = hmac.new(
        WEBHOOK_SECRET.encode(),
        msg=request.data,
        digestmod=hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(computed_signature, signature)

@app.route('/bitbucket-sync', methods=['POST'])
def handle_sync_trigger():
    # 验证请求是否来自Bitbucket
    if not validate_bitbucket_request(request):
        abort(403)
    
    # 解析请求体,确认是目标分支的推送
    payload = request.get_json()
    pushed_branch = payload['push']['changes'][0]['new']['name']
    if pushed_branch != "main": # 替换为你的目标分支
        return "Skip non-target branch sync", 200
    
    # 执行同步脚本
    run_result = subprocess.run(
        [SYNC_SCRIPT_PATH],
        capture_output=True,
        text=True
    )
    if run_result.returncode == 0:
        return "Sync completed successfully", 200
    else:
        return f"Sync failed: {run_result.stderr}", 500

if __name__ == '__main__':
    # 生产环境请用gunicorn等稳定服务器,不要用Flask自带调试服务器
    app.run(host='0.0.0.0', port=5000)

3. 配置Bitbucket Webhook

  1. 打开Bitbucket仓库的「Settings」→「Webhooks」→「Create webhook」
  2. 填写「URL」:你的HTTP服务公网地址 + 路径(比如http://your-server-ip:5000/bitbucket-sync)
  3. 「Triggers」选择「Repository push」
  4. 「Branch selection」选择「Specific branches」,添加你要同步的分支
  5. 「Secret」设置为和脚本中WEBHOOK_SECRET一致的密钥
  6. 保存后,可手动推送一次目标分支测试同步是否生效

额外注意事项

  • 服务器需具备公网访问能力,确保Bitbucket能发送Webhook请求;无公网IP可使用内网穿透工具或云服务器
  • 给同步脚本添加执行权限:chmod +x sync_repo.sh
  • 生产环境建议用gunicorn、uWSGI等稳定HTTP服务器运行Flask服务
  • 可在同步脚本中添加日志输出,方便排查同步失败问题

内容的提问来源于stack exchange,提问作者incnico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:27:51