前言

记录一下使用sh脚本,通过cherry-pick进行同步提交到多个git分支,下面脚本是严重ok的。

正文

创建cherry-pick-batch.sh,然后改为可执行

chmod +x cherry-pick-batch.sh
./cherry-pick-batch.sh

cherry-pick-batch.sh代码如下:

#!/bin/bash
set -e

LOGFILE="./cherry-pick-batch.log"
exec > >(tee -i "$LOGFILE")
exec 2>&1

# 同步的id,id1是先提交的id,依次类推[旧->新]
COMMITS=(
  "commit_id1"
  "commit_id2"
)
# 需要同步的分支
BRANCHES=(
  "branche1"
  "branche2"
)

FAILED_BRANCHES=()

echo "========================================"
echo "Script start at: $(date)"
echo "Git version: $(git --version)"
echo "========================================"

# ---------- 1. 检测是否有未完成的 cherry-pick ----------
if [ -f "$(git rev-parse --git-dir)/CHERRY_PICK_HEAD" ]; then
  echo "❌ Found UNFINISHED cherry-pick"
  echo "Resolve conflicts or run: git cherry-pick --abort"
  exit 1
fi

# ---------- 2. 忽略外部 module ----------
CHANGES=$(git diff --name-only HEAD | grep -vE '^(android13|carocean|unc_linux_trunk_2.0_aex_cockpit_carocean)(/|$)' || true)
if [ -n "$CHANGES" ]; then
  echo "❌ Uncommitted changes in tracked files:"
  echo "$CHANGES"
  exit 1
fi

git fetch origin --progress

# ---------- 3. 是否已 pick(commit + patch-id 双重判断)----------
already_picked() {
  local branch=$1
  local commit=$2

  # 方法1:commit 是否在分支历史中
  if git merge-base --is-ancestor "$commit" "$branch" 2>/dev/null; then
    return 0
  fi

  # 方法2:patch-id 是否已存在(代码一样也算)
  local patch_id
  patch_id=$(git show "$commit" | git patch-id | awk '{print $1}')
  if git log -p "$branch" | git patch-id | grep -q "^$patch_id"; then
    return 0
  fi

  return 1
}

for BRANCH in "${BRANCHES[@]}"; do
  echo
  echo "========================================"
  echo "[INFO] Processing $BRANCH"

  git checkout "$BRANCH"
  git pull --rebase origin "$BRANCH" --progress || true

  NEED_PICK=false
  for COMMIT in "${COMMITS[@]}"; do
    if already_picked "$BRANCH" "$COMMIT"; then
      echo "✅ $BRANCH already contains $COMMIT (commit or patch-id), skip"
    else
      NEED_PICK=true
      break
    fi
  done

  if [ "$NEED_PICK" = false ]; then
    echo "✅ $BRANCH already contains all commits, skip"
    continue
  fi

  echo "[INFO] Cherry-picking to $BRANCH"
  if ! git cherry-pick -x "${COMMITS[@]}"; then
    echo "❌ Cherry-pick failed on $BRANCH"
    FAILED_BRANCHES+=("$BRANCH")
    git cherry-pick --abort
    continue
  fi

  echo "[INFO] Pushing $BRANCH"
  git push origin "$BRANCH"
  echo "✅ $BRANCH done"
done

git checkout yukuai_j168-2

echo
echo "========================================"
if [ ${#FAILED_BRANCHES[@]} -ne 0 ]; then
  echo "❌ Failed branches:"
  printf '%s\n' "${FAILED_BRANCHES[@]}"
else
  echo "✅ All branches succeeded"
fi
echo "Script end at: $(date)"

参考文章

  1. AI

  2. git

相关文章

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...