怎樣防止同事用 QQ 郵箱提交公司程式碼?

崔慶才丨靜覓發表於2021-07-13

事情是這樣的,最近組裡新建了一個程式碼倉庫來開發一個新的產品,再加上今天北京下大雨很多同事選擇在家工作(包括我也是),於是我就選擇用自己的個人電腦來工作。

但我的個人電腦裡面的 Git 資訊是用的我自己的個人郵箱:

git config --global user.name "Germey"
git config --global user.email "cqc@cuiqingcai.com" 
複製程式碼

這兩行命令大家用過 Git 的肯定都敲過對吧?

這個配置是全域性生效的,所以如果我用 Git 的 commit 命令來提交程式碼的話,那麼 commit 的名字和郵箱就會變成剛才我配置的個人資訊。

然後如果把程式碼推送到公司的程式碼倉庫裡面,裡面就會出現一個奇奇怪怪的使用者名稱和頭像,就像這樣子:

image.png

圖中上面兩次 commit 就是我用個人電腦提交的,最後的那次 commit 是我上週在公司用公司電腦提交的。

這是不是很奇怪?

如果其他人也用的個人郵箱提交,那公司程式碼庫裡面就會出現各種怪怪的提交人的記錄,無從知曉。

這肯定不能忍啊,以後要是有誰寫了奇怪的程式碼都不好查是誰寫的。

於是乎,我靈機一動,想:為何不在提交程式碼的時候做一個限制呢?

能做到嗎?當然可以!

Git Hook

這裡就介紹一個知識點 - Git Hook,它的意思就是在 Git 各種事件執行前和執行後執行一些自定義的邏輯,比如說,我們定義一個 pre-commit 的 Git Hook,那就能在 commit 之前執行一些操作,我們定義一個 post-push 的 Git Hook,那就能在 push 操作之後執行一些操作。

有關具體的內容可以參考官方文件:git-scm.com/book/en/v2/…

好,那這裡我其實就是需要在 commit 之前做一下 Git 資訊檢查就好了,比如檢查配置的郵箱不是工作郵箱,那就不允許執行 commit,所以就不會出現奇奇怪怪的 commit 記錄了。

實操

說幹就幹。

配置 Git Hook 的工具有很多,Git 有原生支援,當然我們也可以用第三方庫來做。

目前我們的程式碼倉庫是基於 Node.js 開發的,所以 Node.js 的專案配置 Git Hook 比較流行的解決方案就是 husky,所以這裡我也用 husky 來做了。

首先安裝下 husky:

yarn add husky
複製程式碼

然後配置一個 Node.js 的 prepare 命令,這個命令可以在裝完包 Node.js 包之後自動執行,所以 prepare 命令就配置成 husky 初始化的指令碼,package.json 裡面增加如下配置:

{
  "scripts": {
    ...
    "prepare": "npx husky install"
  },
}
複製程式碼

OK,這樣的話,其他人如果 clone 了這個倉庫,裝完所有 Node.js 包之後就會自動初始化 husky 的配置,然後在專案本地生成一個 .husky 的初始化目錄,這樣 Git Hook 就生效了。

Git Hook 生效之後,所有定義在 .husky 目錄下的 Hook 指令碼都會被應用,比如如果在 .husky 目錄下新增一個 pre-commit 的指令碼,那執行 commit 的之前,該指令碼就會被預先執行做一些檢查工作。

所以 .husky 目錄下我就建立了一個 pre-commit 的指令碼,寫入瞭如下內容:

EMAIL=$(git config user.email)
if [[ ! $EMAIL =~ ^[.[:alnum:]]+@microsoft\.com$ ]];
then
  echo "Your git information is not valid";
  echo "Please run:"
  echo '   git config --local user.name "<Your name in Microsoft>"'
  echo '   git config --local user.email "<Your alias>@microsoft.com"'
  exit 1;
fi;
複製程式碼

這是一個 Linux Shell 指令碼,完全遵循 Shell 語法。

這裡其實就是獲取了 git config user.email 的返回結果,然後用正規表示式匹配是否符合公司郵箱格式,比如我們公司郵箱字尾當然是 microsoft.com 字尾,所以這裡就用了 ^[.[:alnum:]]+@microsoft\.com$ 來進行匹配了。這裡值得注意的是,為什麼這裡沒有用 \S 來代表非空白字元,而是用了一個 [:alnum] 呢?這是因為 Bash Shell 本身不支援 \S 這種匹配,所以這裡得換成 [:alnum]

然後如果不匹配怎麼辦呢?

那就輸出一些錯誤提示就好了,比如這裡就提示請使用 git config —-local 命令來配置使用者名稱和郵箱,之所以用-—local 是因為不想該配置影響全域性的 Git 配置,所以這個配置只針對該倉庫生效,然後 exit 1 就觸發異常退出,程式執行終止,從而也不會觸發 commit 命令了。

有了這個配置,我們來嘗試下效果。

這會我沒有做任何修改,Git 還是原來的配置,即我的全域性個人郵箱配置。

這時候我執行下 commit 命令,就出現錯誤提示了:

Your git information is not valid
Please run:
   git config --local user.name "<Your name in Microsoft>"
   git config --local user.email "<alias>@microsoft.com"
複製程式碼

很棒!檢測出來了。

按照這個提示說的,然後我執行下配置命令:

git config --global user.name "Qingcai Cui"
git config --global user.email "xxxx@microsoft.com" 
複製程式碼

這裡呢,我就配置了我的公司個人資訊和公司郵箱。

然後重新再執行 commit 命令,就不會再出現如上的錯誤提示了!commit 成功!

大功告成!!!

有了它,我們就可以成功阻止一些奇奇怪怪的 commit 亂入公司的程式碼倉庫了!

然後我把這個 PR 發出去了,有同事似乎也是深有感觸,說道:

image_1.png

哈哈哈,有了這個,以後我們應該再也不會看到我們的程式碼倉庫裡面有 QQ 郵箱啦!

希望對大家有幫助~

更多精彩內容,請關注我的公眾號「進擊的 Coder」和「崔慶才丨靜覓」。

相關文章