记录一下使用sh脚本,通过cherry-pick进行同步提交到多个git分支,下面脚本是严重ok的。
正文
创建cherry-pick-batch.sh,然后改为可执行
chmod +x cherry-pick-batch.sh
./cherry-pick-batch.shcherry-pick-batch.sh代码如下:
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)"参考文章
AI

