實(shí)現(xiàn)了一個(gè)shell腳本,自動(dòng)提交代碼更新。配合jenkins使用。
完整代碼
git add .
is_change=0
temFile="temFile"
git status > $temFile
while read aline
do
echo $aline
if [ "$aline" = "Changes to be committed:" ]
# if [ "$aline" = "Untracked files:" ]
then
is_change=1
fi
done < $temFile
if [ $is_change -eq 1 ]
then
git commit -m "自動(dòng)更新"
git push
fi
前提條件
- shell執(zhí)行用戶有文件夾權(quán)限
- 不需要顯式認(rèn)證(git上配置了ssh或者保存了用戶名密碼)
原理
執(zhí)行g(shù)it status,獲取當(dāng)前狀態(tài)
遍歷狀態(tài)字符串,是否包含"Changes to be committed:"等字符串
如果包含上述字符串則進(jìn)行commit和push
關(guān)鍵代碼就是循環(huán)比對(duì),遇到while循環(huán)變量作用域問(wèn)題
git status | while read aline
do
echo $aline
if [ "$aline" = "Changes to be committed:" ]
# if [ "$aline" = "Untracked files:" ]
then
is_change=1
fi
done
上面雖然執(zhí)行了is_change=1,但沒(méi)有執(zhí)行commit和push。問(wèn)題出在while上。
while循環(huán)讀取文件中內(nèi)容有兩種寫法,一種是管道符,一種是重定向。
重定向是內(nèi)建命令,而管道符是非內(nèi)建命令,linux執(zhí)行shell時(shí),會(huì)創(chuàng)建“子shell”運(yùn)行shell中的命令,當(dāng)運(yùn)行到非內(nèi)建指令時(shí),會(huì)創(chuàng)建“孫shell”運(yùn)行非內(nèi)建指令
變量的作用于在每個(gè)shell中有效,所以,非內(nèi)建指令中定義的這些變量就只能在孫shell運(yùn)行,而在子shell中不生效。