# @Author: Jrri
# @Date: 2022-08-11 16:23:37
# @Last Modified by: Jrri
# @Last Modified time: 2022-08-11 17:10:13
# 实现将Git仓库中的某个分支中的某目录,在保存提交记录的情况下单独拆出, 并上传到新库的操作
# 注意: 该脚本只针对一个分支进行拆分, 拆分后默认上传到master分支
# 需要准备: 手动创建新仓库, 本地确保已配置了新旧仓库所在服务的SSH免密, 并拥有权限
# 参数:
## 原仓库(ORIGIN_REPO_URL): 原仓库的URL
## 分支名(ORIGIN_BRANCH_NAME): 需要拆分代码所在分支
## 目录(ORIGIN_PATH): 需要拆分代码所在的目录
## 目标仓库(TARGET_REPO_URL): 目标仓库的URL
ORIGIN_REPO_URL="git@git.XXX.com:Jrri/test.git"
TARGET_REPO_URL="git@git.XXX.com:Jrri/test_split.git"
ORIGIN_BRANCH_NAME="master"
ORIGIN_PATH="src/tools"
SCRIPT_DIR=$(readlink -f $0|xargs dirname)
TIMESTAMP="$(date +%Y%m%d%H%M%S)"
OLD_DIR_NAME="$(echo $ORIGIN_REPO_URL|sed -ne 's#.*/\(.*\).git#\1#p')-$TIMESTAMP"
# clone库
git clone $ORIGIN_REPO_URL -b $ORIGIN_BRANCH_NAME $OLD_DIR_NAME
cd $OLD_DIR_NAME
NEW_DIR_NAME="$(basename $ORIGIN_PATH)"
# 需要从Git仓库的顶级开始输入目录
git subtree split -P $ORIGIN_PATH -b $TIMESTAMP
git checkout $TIMESTAMP
cd $SCRIPT_DIR
# 创建一个新库
mkdir "$NEW_DIR_NAME-$TIMESTAMP"
cd "$NEW_DIR_NAME-$TIMESTAMP"
git init
# 拉取代码
git pull ../$OLD_DIR_NAME
# 添加远程库
git remote add origin $TARGET_REPO_URL
git push --set-upstream origin master