Showing posts with label Git. Show all posts
Showing posts with label Git. Show all posts

Tuesday, January 2, 2024

Git 增量打版抽取脚本

 

patch.sh

# 定义sed -i 参数(数组)
# Default case for Linux sed, just use "-i"
sedi=(-i)
case "$(uname)" in
 # For macOS, use two parameters
Darwin*) sedi=(-i "")
esac

function getTargetpathLog(){
 if [ -f targetpath.log ];then
 echo "存在targetpath,将删除该文件!";
 rm -rf targetpath.log
 fi;
 #取最新两条tag写入gitversion.log
 # git checkout origin/uat
 # git pull origin yat
 #git fetch --tags origin
 rm -rf git.log
 echo "请输入new分支名称(quit退出):"
 while true
 do
  read newbaseline
   newbaseline=$(eval echo $newbaseline)
   if [ $newbaseline = "quit" ];then
     exit 0;
   fi
   dev=`git branch | grep ".* ${newbaseline}$"`
  if [ -n "$dev" ];then
    break;
   else
     echo "当前工作区下此new分支不存在,请重新输入: "
   fi
 done
 echo "请输入old分支名称(quit退出): "
 while true
 do
  read oldbaseline
   if [ $oldbaseline = "quit" ];then
     exit 0;
   fi
   oldbaseline=$(eval echo $oldbaseline)
   feat=`git branch | grep ".* ${oldbaseline}$"`
  if [ -n "$feat" ];then
    break;
   else
     echo "当前工作区下此old分支不存在,请重新输入: "
   fi
 done
 git diff --name-status $oldbaseline $newbaseline > targetpath.log
}

function judgeSpeciel(){
 str="TaskWorkListServlet.java"
 res=$(echo ${full_path}| grep "${str}")
 if [ -n "$res" ]
 then
   #TODO
   tem=${full_path/\/src\/main\/java\/com\/hylandtec\/intelliplatform\/webapp/}
   target_path=${targetDir}/${tem%/*}
  copyFile
  return 1
 fi
}


function copyFile(){
if [ "${source_path}" == "./" ]
then
  return
fi
if [ -f "${source_path}" ]
then
  if [ ! -d "${target_path}" ]
  then
    mkdir -p ${target_path}
  fi
fi
echo "复制[${source_path}]到[${target_path}]"
cp ${source_path} ${target_path}
}

function copyCommon (){
 type1="webapp"
 type2="resources"
 type3=".java"
 type4="database"
 res1=$(echo ${full_path} | grep "${type1}")
 res2=$(echo ${full_path} | grep "${type2}")
 res3=$(echo ${full_path} | grep "${type3}")
 res4=$(echo ${full_path}| grep "${type4}")
 source_path= ${source}/${full_path}
 echo "源路径:${source_path}"
 if [ -n "$res1" ]
 then
   #TODO
   var= ${full_path/\/src\/main\/webapp/}
   target_path= ${targetDir}/${var%/*}
 elif [ -n "$res2" ]
 then
   #TODO
   if [ $project_name == "tfb-web"]
   then
     var=${full_path/\/src\/main\/resources\/WEB-INF\/classes}
     target_path= ${targetDir}/${var%/*}
    copyFile
    return
   fi
   var=${full_path/\/src\/main\/resources/}
   target_path=${targetDir}/${var%/*}
 elif [ -n "$res3" ]
 then
   #TODO
  judgeSpeciel
   flag=$?
   if [ $flag == 1 ]
   then
    return
   fi
   var=${full_path/\.java/\.class}
   var=${var/src\/main\/java/target\/classes}
   source_path=${source}/${var}
   if [ $project_name != "tfb-web" ]
   then
     var1=${var/\/target\/classes/}
     target_path=${targetDir}/${var1%/*}
    copyFile
     s=${var%/*}
     source_path="${source}/${s}""\$*.class"
    copyFile
    return
   fi
   var1=${var/target/WEB-INF}
   target_path=${targetDir}/${var1%/*}
  copyFile
   s=${var%.*}
   source_path="${source}/${s}""\$*.class"
 elif [ -n "$res4"]
 then
   #TODO
   echo "====${res4}======"
   source_path=${source}/${full_path}
   target_path=${targetDir}/${full_path%/*}
 fi
copyFile
}

function getBatchzip (){
 echo "INFO:dealing batch"
 ls;
 rm -rf tfbbatch;
 mkdir tfbbatch;

 cp -r ${filePath}/* tfbbatch/
 cd tfbbatch
 #delete web in patch.txt
 sed "${sedi[@]}" '/tfb-web,/d' patch.txt;
 #delete dir
 rm -rf database
 rm -rf tfb-web
 if [[ $(ls | wc -l) -eq 1 ]];then
   echo "INFO:There is not other files but patch.txt,exit";
   cd ..
   rm -rf tfbbatch
   result=-1;
  return 1
 fi
 #move the batch.zip
zip -r tfbbatch.zip *
 mv tfbbatch.zip ../.
 cd ..
 rm -rf tfbbatch
 echo "INFO;tfbbatch.zip success!"
 result=0;
}


function getWebZip(){
  echo "INFO:dealing web"
  ls;
  rm -rf tfbweb;
  mkdir tfbweb;
  cp -r ${filePath}/* tfbweb/

  cd tfbweb
  #delete batch in patch.txt
  #delete all other files
  sed "${sedi[@]}" '/hytfb-batch,/d' patch.txt;
  rm -rf database
  rm -rf hytfb-batch
  if [[ $(ls | wc -l) -eq 1 ]];then
     echo "ERROR:There is not files but patch.txt,exit"
     cd ..
     rm -rf tfbweb
     result=-1
    return 1;
  fi
  #仅生成打包一个web
  zip -r tfbweb.zip *
  mv tfbweb.zip ../.
  cd ..
  rm -rf tfbweb
  echo "INFO;tfb-web.zip auccess!"
  result=0;
}


main(){
getTargetpathLog
 source=.
 target=./tfbsit
 date=` date +%Y%m%d`
 filePath="tfb_uat"
 targetDir=${target}/${date}/${filePath}
 if [ -d "${targetDir}" ]
 then
   rm -r ${targetDir}
 fi

 #读取targetpach.log
 while read line
 do
   info=($line)
   full_path=${info[1]}
   #echo $full_path
   project_name=${full_path%%/*}
   echo "======${project_name}========="
  copyCommon
 done < targetpath.log

 cd ${target}/${date}
pwd
 #生成patch.txt文件
 find ${filePath} | xargs ls -ld | grep -v ^d |grep -v '.*patch,txt' | grep -Ev '*\.sh'| grep -Ev '*\.sql'|grep -Ev '*\.tar'> ${filePath}/patch.txt
 sed "${sedi[@]}" 's/.*'${filePath}'\//r,/g' ${filePath}/patch.txt
 sed "${sedi[@]}" 's/\//,/' ${filePath}/patch.txt
 #生成zip文件
 #run batch
 if [[ $(ls ${filePath} | grep -v tfb-web | wc -l) -gt 0 ]];then
  getBatchzip;
 fi
 #run web
 if [[ $(ls ${filePath}| grep -v hytfb-batch | wc -l) -gt 0 ]];then
  getWebZip;
 fi
}

main

使用

./patch.sh

new 分支一般使用 UAT, 分支, old 分支一般是 feat 分支合并到 UAT 分支后打了一个 tag, 这个 tag 就是 old 分支。结合 Git 实战指南博客使用更佳哦。

Sunday, December 24, 2023

Git 使用

常用指令

修改远程仓库地址

git remote set-url [--push] <name> <newurl> [<oldurl>]

如将 origin 的远程仓库地址设置为 http://github.com/water-law/blogs.git

git remote set-url origin  http://github.com/water-law/blogs.git

重名名分支

git branch -m oldBranchName newBranchName

删除分支

git branch -d branchName

或者强制删除

git branch -D branchName

对比两个分支的差异

git diff master...feat/XQ-2021-6-371

分段提交代码

git add -p <file>

stash 暂存指定文件

git stash push -m "WIP: XQ-2021-6-371: xxx"  Hello.java

stash 暂存

git stash save "WIP: XQ-2021-6-371: xxx"

stash 查询

git stash list

应用 stash 的代码

git stash apply stash@{N}

删除 stash

git stash drop stash@{N}

放弃跟踪某个文件

git update-index --assume-unchanged <file>

跟踪某个文件

git update-index --no-assume-unchanged <file>

git reset

语法 回退到 commit_id 提交,--soft 会保持 commit_id 到当前 HEAD 的文件修改内容, commit_id 到当前 HEAD 的提交记录会被删除

git reset --soft <commit_id>

回退到 commit_id 提交,--hard 不保持 commit_id 到当前 HEAD 的文件修改内容,commit_id 到当前 HEAD 的提交记录会被删除

git reset --hard <commit_id>

cherry-pick

cherry-pick 用于提取某个 commit 记录追加到当前分支上 拉取远程所有的分支、tag到本地

git fetch --all 

切换到远程uat分支

git checkout origin/uat

更新

git pull origin uat

从当前分支(origin/uat)检出一条处理冲突的临时分支

git checkout -b cherry-pick/feat/xq-2021-1-259_20211213 

可以先提 mr, 得到一个 commit_id(merge 的 id) aae2c1e599a8e834410a4337e93d8ffdf25593b1 在当前分支执行该 commit_id 的 cherry-pick

git cherry-pick 远程分支 mergeID -m 1

(例:git cherry-pick origin/feat/xq-2021-1-259 aae2c1e599a8e834410a4337e93d8ffdf25593b1 -m 1)

分支命名规范

需求分支

feat+/+需求号,如 :feat/XQ-2021-6-278

开发分支

dev+/+姓名+-+需求分支名,如:dev/wuxincheng-feat/XQ-2021-6-278

临时需求分支

mr+/开发分支名+-+to-feat-日期,如:mr/dev/wuxincheng-feat/XQ-2021-6-278-to-feat-20210930

临时 uat 分支

mr+/需求分支+-to-uat-日期,如:mr/feat/XQ-2021-6-278-to-uat-20210930

临时 release 分支

mr/需求分支+to-release-日期,如:mr/feat/XQ-2021-6-278-to-release-20210930

临时同步 master 代码分支

mr/syncmaster-to-需求分支-日期,如:mr/syncmaster-to-feat/XQ-2021-6-278-20210930

master 分支同步到 feat 分支

上线后,同步 master 分支代码到 feat 分支

检出 master

git checkout master

更新 master

git pull origin master

检出 feat

git checkout feat/xxx

更新 feat

git pull origin feat/xxx

从 feat 检出新分支

git checkout -b mr/syncmaster-to-feat/xxx-20220520

合并 master

git merge master

merge 这步无冲突则进行 push, 有冲突则解决冲突,commit 后再 push

push

git push origin mr/syncmaster-to-feat/xxx-20220520

提 mr

提 mr/syncmaster-to-feat/xxx-20220520 到 feat 的 mr

feat 分支合并到 uat 分支

开发分支合并到需求分支以后,开发人员通过 git pull 指令从远程拉取最新 feat 分支代码以及最新的 uat 分支代码到本地。每次合并都需要先拉取最新的 uat 分支。

从 uat 分支拉取一个 mr 临时分支,命令格式为 mr/feat/xxxx-to-uat-20220428,在本地执行 git merge feat/xxxx,以后,将mr 分支推送到远程 coding,并发起合并请求。

拉取合并请求的步骤与合并到 feat 的过程一致 评审人员处理此 checklist 可简单处理,直接通过,点击允许后,仍由国结版本发布账号处理合并,并打 tag 后执行构建计划,将版本打到 uat 服务器上。

拉取远程所有的分支、tag 到本地

git fetch --all

切换到远程 uat 分支

git checkout uat

更新 uat

git pull origin uat

从当前分支(origin/uat)检出一条处理 mr 的临时分支

git checkout -b mr/feat/xq-2021-11-159_20220428-to-uat

如果本地没有 feat 分支则执行 fetch

拉取 feat 分支到本地

git fetch origin feat/xq-2021-11-159:feat/xq-2021-11-159

有 feat 分支则切换到 feat 分支 执行 pull

git checkout feat/xq-2021-11-159
git pull origin feat/xq-2021-11-159

或者不 checkout 一次到位

git pull origin feat/xq-2021-11-159:feat/xq-2021-11-159

合并 feat 分支

git checkout mr/feat/xq-2021-11-159_20220428-to-uat
git merge feat/xq-2021-11-159

有冲突处理冲突后 commit, push,无冲突则直接 push

git commit -m "uat mr xq-2021-11-159"

推送分支到远程

git push origin mr/feat/xq-2021-11-159_20220428-to-uat

提 mr/feat/xq-2021-11-159_20220428 到 uat 的 mr


Spring 知识

编程性事务 注意.使用Spring自带的事,在抛RuntimeException时会自动回演,代码抛其他异常不会回滚。 国结批处理中若需要支持回滚,可使用以下方法 import org . springframework . jdbc . datasource . DataSo...