以上都可以通过修改awk命令来实现,修改后得到:
#!/bin/bash # v4 tag=$1 repo forall -p -c git log -1 $tag --pretty=format:'%h' | awk '{tmp=$2;getline;print "cd "tmp"; git tag '$tag' "$1"; cd -;"}'看起来差不多了,重定向到文件中,加上必要的sheban,即#!/bin/bash
#!/bin/bash # v5 tag=$1 file=set-tag-$tag.sh echo "#!/bin/bash" > $file echo "" >> $file repo forall -p -c git log -1 $tag --pretty=format:'%h' | awk '{tmp=$2;getline;print "cd "tmp"; git tag '$tag' "$1"; cd -;"}' >> $file chmod +x $file #for debug cat $file执行后可得到set-tag-test-v1.sh脚本
$cat ./set-tag-test-v1.sh #!/bin/bash cd python/convertfb/; git tag test-v1 774ddb6; cd -; cd rust/cut-trailing-bytes/; git tag test-v1 e9e78ee; cd -; cd shell/EasierMinicom/; git tag test-v1 059c803; cd -; cd shell/PathMarker/; git tag test-v1 4b6e219; cd -; cd shell/pop-up-task-diary/; git tag test-v1 5d85ed2; cd -; cd shell/smartbc/; git tag test-v1 9d7bc06; cd -;接收方运行这个脚本即可。
完善脚本实际验证下,很快发现问题
已经打过了tag需要更新,重复打会报错,需要先删除同名tag
如果接收方代码中不存在对应的commit(例如代码未更新),虽然会报错,但脚本没有暂停,可能会让人忽略该报错
没有提示处理的仓库路径
存在冗余信息,例如 cd - 会打印路径,其实是没作用的
解决方式
打tag之前先删除原有同名tag,即执行git tag -d $tag,再考虑tag可能不存在会报错,加上错误log重定向 2>/dev/null
打tag失败则中止运行,即加上 || exit 1
cd之前,先打印目标路径, 即加上 echo tmp
屏蔽掉cd -的输出, 即加上 > /dev/null
顺便加点换行,调整下输出的脚本,可得到
#!/bin/bash # v6 tag=$1 file=update-tag-$tag.sh echo "#!/bin/bash" > $file echo "" >> $file repo forall -p -c git log -1 $tag --pretty=format:'%h' | awk '{tmp=$2;getline;print "echo "tmp"\ncd "tmp"\ngit tag -d '$tag' 2>/dev/null\ngit tag '$tag' "$1" || exit 1\ncd - > /dev/null\n"}' >> $file chmod +x $file #for debug cat $file此时生成的打tag脚本就变成了
$ cat ./update-tag-test-v1.sh #!/bin/bash echo python/convertfb/ cd python/convertfb/ git tag -d test-v1 2>/dev/null git tag test-v1 774ddb6 || exit 1 cd - > /dev/null echo rust/cut-trailing-bytes/ cd rust/cut-trailing-bytes/ git tag -d test-v1 2>/dev/null git tag test-v1 e9e78ee || exit 1 cd - > /dev/null echo shell/EasierMinicom/ cd shell/EasierMinicom/ git tag -d test-v1 2>/dev/null git tag test-v1 059c803 || exit 1 cd - > /dev/null echo shell/PathMarker/ cd shell/PathMarker/ git tag -d test-v1 2>/dev/null git tag test-v1 4b6e219 || exit 1 cd - > /dev/null echo shell/pop-up-task-diary/ cd shell/pop-up-task-diary/ git tag -d test-v1 2>/dev/null git tag test-v1 5d85ed2 || exit 1 cd - > /dev/null echo shell/smartbc/ cd shell/smartbc/ git tag -d test-v1 2>/dev/null git tag test-v1 9d7bc06 || exit 1 cd - > /dev/null最后加点提示语句,参数检查
#!/bin/bash show_help() { echo -e "Usage: share_tag.sh <tag>" echo -e 'Eg. ./share_tag.sh release-v1' } [ x"$1" = x"" ] && { show_help exit 1 } tag=$1 file=update-tag-$tag.sh echo "#!/bin/bash" > $file echo "" >> $file repo forall -p -c git log -1 $tag --pretty=format:'%h' | awk '{tmp=$2;getline;print "echo "tmp"\ncd "tmp"\ngit tag -d '$tag' 2>/dev/null\ngit tag '$tag' "$1" || exit 1\ncd - > /dev/null\n"}' >> $file chmod +x $file #for debug cat $file echo -e '\033[0;31;1m' echo "to update tag $tag, please run ./$file" echo -e '\033[0m' 总结本地已打好tag,如 test-v1,需要分享给他人则运行./repo_share_tag.sh test-v1
本地没有tag,那可以先批量打一个tag,再如上所述导出脚本给他人。
批量打tag : repo forall -c git tag test-v1
批量删tag : repo forall -c git tag -d test-v1
东拼西凑出来的脚本,暂时也够用了,后续有更新会放到 https://github.com/zqb-all/repo-share-tag
blog: https://www.cnblogs.com/zqb-all/p/13057786.html
公众号:https://sourl.cn/BKeNSL