同步切换多个仓库分支的git脚本
本帖最后由 水木杉 于 2024-8-22 09:26 编辑背景:一个软件有三个仓库,每个仓库都是编译出一个dll,现在这个软件有两个版本,需要经常切换这些仓库的版本,于是就让GPT帮忙写了这个脚本,功能就是配置好两个版本对应的分支名称,然后实现一键同步切换,代码放出来供大家参考,还有什么其他方案也欢迎讨论。
使用:脚本可以传参1、2,1表示切换到第一个版本,2表示切换到第二个版本;不传参的话会切换到当前版本相对的另一个版本;如果有未提交更改会有10s提示,不操作就把修改还原后再切换;我是创建了两个快捷方式,分别传递1和2的参数,点快捷方式切换到相应的版本。
#!/bin/bash
# 定义仓库目录和仓库名称
REPO_DIR="xxxxxx"
REPOS=("仓库1" "仓库2" "仓库3") # 修改为你的仓库名称
# 定义版本分支
VERSION_1_BRANCHES=("仓库1_版本1" "仓库2_版本1" "仓库3_版本1")
VERSION_2_BRANCHES=("仓库1_版本2" "仓库2_版本2" "仓库3_版本2")
# 检查是否有未提交的更改
function check_uncommitted_changes {
if git diff-index --quiet HEAD -- || git diff-files --quiet; then
return 1
else
return 0
fi
}
# 等待用户输入决定是否提交或丢弃更改
function prompt_uncommitted_changes {
echo "There are uncommitted changes in $1."
echo "Please commit your changes or they will be discarded in 10 seconds..."
read -t 10 -p "Press Enter to continue or Ctrl+C to cancel..."
if [ $? -gt 128 ]; then
echo "No input received. Discarding changes..."
git reset --hard
fi
}
# 切换所有仓库到指定的版本分支
function switch_to_version_branches {
local version=$1
# 根据传入的版本参数选择目标分支
if [ "$version" == "1" ]; then
target_branches=("${VERSION_1_BRANCHES[@]}")
elif [ "$version" == "2" ]; then
target_branches=("${VERSION_2_BRANCHES[@]}")
else
# 获取第一个仓库的当前分支
cd "$REPO_DIR/${REPOS}"
current_branch=$(git rev-parse --abbrev-ref HEAD)
# 检查当前分支是否在 VERSION_1_BRANCHES 或 VERSION_2_BRANCHES 中
is_version_1=false
for branch in "${VERSION_1_BRANCHES[@]}"; do
if [ "$current_branch" == "$branch" ]; then
is_version_1=true
break
fi
done
# 如果第一个仓库的分支在 VERSION_1_BRANCHES 中,则切换到 VERSION_2_BRANCHES
if $is_version_1; then
target_branches=("${VERSION_2_BRANCHES[@]}")
else
# 检查是否在 VERSION_2_BRANCHES 中
is_version_2=false
for branch in "${VERSION_2_BRANCHES[@]}"; do
if [ "$current_branch" == "$branch" ]; then
is_version_2=true
break
fi
done
# 如果在 VERSION_2_BRANCHES 中,则切换到 VERSION_1_BRANCHES
if $is_version_2; then
target_branches=("${VERSION_1_BRANCHES[@]}")
else
# 默认使用 VERSION_1_BRANCHES
target_branches=("${VERSION_1_BRANCHES[@]}")
fi
fi
fi
# 遍历所有仓库并切换到目标分支
for (( i=0; i<${#REPOS[@]}; i++ )); do
repo="${REPOS[$i]}"
cd "$REPO_DIR/$repo"
# 检查是否有未提交的更改
if check_uncommitted_changes; then
prompt_uncommitted_changes "$repo"
fi
target_branch="${target_branches[$i]}"
echo "Switching $repo from $(git rev-parse --abbrev-ref HEAD) to $target_branch"
git checkout "$target_branch" || {
echo "Failed to switch $repo to $target_branch, rolling back..."
git checkout -
exit 1
}
# 如果需要,可以添加 git pull 来确保分支是最新的
git pull origin "$target_branch"
cd ..
done
echo "All repositories have been switched to the specified version branches."
}
# 调用函数并传递参数
if [ $# -eq 0 ]; then
switch_to_version_branches
else
switch_to_version_branches $1
fi
linux交叉编译dll文件? Andy1024 发表于 2024-8-22 09:24
linux交叉编译dll文件?
用的windows,也没啥交叉编译,都是独立的dll{:1_925:} 我还以为是shell脚本 正好要学习git 最近的学习的要点来了 正好要学习git 用idea来管理挺好的呀 请问有什么好用的仓库管理软件吗 学习学习
页:
[1]