repo 导出本地 git tag 给他人 (2)

以上都可以通过修改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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzzwp.html