看一个项目中经常用到的下代码方法:
一、已知条件:
知道gerrit服务域名与端口(一般默认都是29418),有下代码权限;通过测试命令看是否有权限,简单测试命令如下:
ssh -p 29418 xxxx.xxx.xxx
二、下代码原理:
1.通过ssh命令获取到所有的project;
2.逐个git初始化project仓库(git init --bare xxx.git);
3.逐个仓库fetch (git fetch --all)
三、知识点梳理:
1⃣️
ssh -p 29418 xxxx.xxx.xxx gerrit --help
ssh -p 29418 xxxx.xxx.xxx gerrit ls-projects --help
ssh -p 29418 xxxx.xxx.xxx gerrit ls-projects --type CODE -r REGEX
2⃣️
shuf:把输入行按随机顺序输出到标准输出。
用法: shuf [选项]... [文件]
或者: shuf -e [选项]... [参数]...
或者: shuf -i LO-HI [选项]...
常用参数:
-e, --echo 将每个参数视为输入行
-i, --input-range=LO-HI 将LO 到HI 的每个数字视为输入行
-n, --head-count=行数 最多输出指定的行数
-o, --output=文件 将结果输出到指定文件而非标准输出
--random-source=文件 从指定文件获得随机比特
-z, --zero-terminated 以0 结束行而非新行
--help 显示此帮助信息并退出
--version 显示版本信息并退出
如果没有指定文件,或者文件为"-",则从标准输入读取。
3⃣️
xargs命令的作用,是将标准输入转为命令行参数。
真正执行的命令,紧跟在xargs后面,接受xargs传来的参数。
xargs的作用在于,大多数命令(比如rm、mkdir、ls)与管道一起使用时,都需要xargs将标准输入转为命令行参数。
$ echo "one two three" | xargs mkdir
上面的代码等同于mkdir one two three。如果不加xargs就会报错,提示mkdir缺少操作参数。
$ echo "hello world" | xargs echo
hello world
http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html
四、实际项目中用到的shell脚本函数:
function git_clone_all(){
local L_REGEX="$1" # REGEX 正则匹配需要获取哪个目录下的所有的git仓库
local L_LENGTH="$2" # 去掉开头git仓库路径,如果cd到其下子目录了。这里需要去掉。
ssh -p ${gerrit_port} ${gerrit_host} gerrit ls-projects --type CODE -r "${L_REGEX}" | shuf | xargs -r -n1 -P4 -I% bash -c '
L_LOCAL_GIT=${1:${2}}.git
#shell字符串切片:${variable_name:start_position:length}
# $ string=abcdefghijklmnopqrstuvwxyz
# $ echo ${string:4} efghijklmnopqrstuvwxyz
L_REMOTE_GIT=${3}/${1}
echo "will init for ${L_LOCAL_GIT} with ${L_REMOTE_GIT}"
git init --quiet --bare ${L_LOCAL_GIT}
cat >${L_LOCAL_GIT}/config <<EOF
[core]
repositoryformatversion = 0
filemode = true
bare = true
[remote "origin"]
url = ${L_REMOTE_GIT}
fetch = +refs/*:refs/*
mirror = true
EOF
find ${L_LOCAL_GIT}/objects -type f -empty -delete -print #查找空对象文件删除
find ${L_LOCAL_GIT}/refs -type f -empty -delete -print
git -C ${L_LOCAL_GIT} fetch --all
' "_" "%" "${L_LENGTH}" "ssh://${gerrit_host}:${gerrit_port}"
}