国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一個(gè) git 倉(cāng)庫(kù)下?lián)碛卸鄠€(gè)項(xiàng)目的 git hooks 配置方案

這篇具有很好參考價(jià)值的文章主要介紹了一個(gè) git 倉(cāng)庫(kù)下?lián)碛卸鄠€(gè)項(xiàng)目的 git hooks 配置方案。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

通常情況下,一個(gè) git 倉(cāng)庫(kù)就是一個(gè)項(xiàng)目,只需要配置一套 git hooks 腳本就可以執(zhí)行各種校驗(yàn)任務(wù)。對(duì)于 monorepo 項(xiàng)目也是如此,monorepo 項(xiàng)目下的多個(gè) packages 之間,它們是有關(guān)聯(lián)的,可以互相引用,所以當(dāng)成一個(gè)項(xiàng)目也沒(méi)問(wèn)題。

但是也有一種情況,一個(gè) git 倉(cāng)庫(kù)下的多個(gè)項(xiàng)目之間是彼此獨(dú)立的,比如 git 倉(cāng)庫(kù)下存在前端項(xiàng)目、后端項(xiàng)目、文檔項(xiàng)目等等。這時(shí)候就需要為每個(gè)項(xiàng)目配置不同的 git hooks 腳本了,因?yàn)椴煌捻?xiàng)目有可能校驗(yàn)規(guī)則不一樣。

本文主要探討一下如何為不同的項(xiàng)目配置 git hooks 腳本。

PS:配置 git hooks 腳本使用 huksy。

方案一:每個(gè)項(xiàng)目下都配置一套 git hooks 腳本

假設(shè)倉(cāng)庫(kù)擁前后端兩個(gè)項(xiàng)目:

frontend
backend

那么我們需要在每個(gè)項(xiàng)目下安裝 husky,同時(shí)要在 package.json 中配置一下 prepare 腳本(這里以前端項(xiàng)目為示例):

# package.json
{
	"scripts" {
		"prepare": "cd .. && husky install frontend/.husky"
	}
}

然后按照 husky 文檔創(chuàng)建 pre-commitcommit-msg 鉤子文件:

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# pre-commit
cd frontend
npx lint-staged
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# commit-msg
cd frontend
FORCE_COLOR=1 node scripts/verifyCommitMsg.mjs $1

上面展示的是前端項(xiàng)目的 git hooks 創(chuàng)建過(guò)程,后端項(xiàng)目按照同樣的過(guò)程創(chuàng)建即可。目前倉(cāng)庫(kù)的目錄結(jié)構(gòu)如下:

frontend
	.husky
		- pre-commit
		- commit-msg
backend
	.husky
		- pre-commit
		- commit-msg

運(yùn)行一段時(shí)間后,發(fā)現(xiàn)這個(gè)方案有問(wèn)題,那就是每次觸發(fā)的 git hooks 腳本都是前端項(xiàng)目的,后端項(xiàng)目提交代碼根本不觸發(fā) git hooks。排查問(wèn)題后發(fā)現(xiàn)是 git 倉(cāng)庫(kù)的配置引起的,打開(kāi) .git/config 文件:

[core]
	hooksPath = frontend/.husky

上面 hooksPath 路徑對(duì)應(yīng)的就是 git hooks 的目錄位置,目前 git 只支持指定一個(gè)目錄作為 git hooks 的位置。所以第一個(gè)方案不靠譜,達(dá)不到我們想要的效果。

方案二:只在根目錄下配置一套 git hooks 腳本

第二個(gè)方案是將 git hooks 放在項(xiàng)目根目錄下,統(tǒng)一在根目錄里執(zhí)行各個(gè)子項(xiàng)目的校驗(yàn)?zāi)_本。這個(gè)方案有以下幾個(gè)步驟:

修改 husky 安裝位置

在每個(gè)項(xiàng)目下安裝 husky 時(shí),要把 git hooks 鉤子目錄設(shè)置在根目錄:

# package.json
{
	"scripts" {
		"prepare": "cd .. && husky install .husky" # 放到根目錄
	}
}

同時(shí) .git/config 文件也要修改一下:

[core]
	hooksPath = .husky # 改為根目錄

在 git hooks 中進(jìn)行各個(gè)子項(xiàng)目的校驗(yàn)操作

這里以 commit-msg 作為示例編寫(xiě)一個(gè)腳本:

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# 拿到所有改動(dòng)的文件名
changedFiles=$(git diff --cached --name-only --diff-filter=ACM)

# 判斷目錄是否改動(dòng)
isBackendChanged=false
isFrontendChanged=false

for file in $changedFiles
do
    if [[ $file == frontend/* ]]
    then
        isFrontendChanged=true
    elif [[ $file == backend/* ]]
    then
        isBackendChanged=true
    fi
done

# 改動(dòng)的目錄需要執(zhí)行校驗(yàn)命令
# $1 $2 代表傳給函數(shù)的第一個(gè)、第二個(gè)參數(shù)
execTask() {
    echo "root $1 commit-msg"
    cd $1
    FORCE_COLOR=1 node scripts/verifyCommitMsg.mjs $2
}

if $isFrontendChanged
then
    execTask "frontend" $1 & # 使用 & 讓任務(wù)在后臺(tái)執(zhí)行
    task1=$! # 保存任務(wù) id
fi

if $isBackendChanged
then
    execTask "backend" $1 &
    task2=$!
fi

if [[ -n $task1 ]]; then
    wait $task1
fi

if [[ -n $task2 ]]; then
    wait $task2
fi

echo "All tasks finished."

上面腳本的邏輯是這樣的:

  1. 每次 git 提交代碼時(shí),判斷一下當(dāng)前所有改動(dòng)的文件是屬于哪個(gè)項(xiàng)目
  2. 文件發(fā)生改動(dòng)的項(xiàng)目需要執(zhí)行校驗(yàn)任務(wù)
  3. 每個(gè)校驗(yàn)任務(wù)都使用子進(jìn)程去執(zhí)行
  4. 等待所有校驗(yàn)任務(wù)執(zhí)行結(jié)束后,輸出 All tasks finished.

pre-push 腳本編寫(xiě)

pre-commitcommit-msg 不同,在 pre-push 鉤子中需要通過(guò)其他方式來(lái)拿到發(fā)生改動(dòng)的文件,大家直接看代碼:

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"


# 判斷目錄是否改動(dòng)
isFrontendChanged=false
isComponentTemplateChanged=false
isComponentAttrPanelChanged=false

# 獲取遠(yuǎn)程倉(cāng)庫(kù)的名字和 URL
remote="$1"
url="$2"

# 定義一個(gè)空的 git 哈希值
z40=0000000000000000000000000000000000000000

# 這個(gè)循環(huán)從 stdin 讀取數(shù)據(jù),這些數(shù)據(jù)是 git 在調(diào)用 pre-push 鉤子時(shí)傳遞的。
# 每一行數(shù)據(jù)包括 4 個(gè)字段:本地引用名,本地最新的提交哈希值,遠(yuǎn)程引用名,遠(yuǎn)程最新的提交哈希值。
while read local_ref local_sha remote_ref remote_sha
do
    # 這段代碼檢查是否正在刪除一個(gè)引用(例如,刪除一個(gè)分支)。如果是,那么本地的 sha 值將被設(shè)置為一個(gè)空哈希值。
    if [ "$local_sha" = $z40 ] 
    then
        # Handle delete
        :
    else
        # 這段代碼確定要檢查哪些提交。如果遠(yuǎn)程的 sha 值是一個(gè)空哈希值,那么我們正在創(chuàng)建一個(gè)新的引用,所以我們需要檢查所有的提交。
        # 否則,我們正在更新一個(gè)已經(jīng)存在的引用,所以我們只需要檢查新的提交。
        if [ "$remote_sha" = $z40 ] 
        then
            # New branch, examine all commits
            range="$local_sha"
        else
            # Update to existing branch, examine new commits
            range="$remote_sha..$local_sha"
        fi

        # 這個(gè)循環(huán)對(duì)每一個(gè)包含在 range 變量中的提交執(zhí)行 git rev-list 命令,這個(gè)命令會(huì)返回一系列的提交哈希值。
        # 然后,對(duì)每個(gè)提交,我們使用 git diff-tree 命令來(lái)找到在那個(gè)提交中修改的文件。這些文件的名字被存儲(chǔ)在 files 變量中。
        for commit in $(git rev-list "$range"); do
            # 拿到所有改動(dòng)的文件名
            files=$(git diff-tree --no-commit-id --name-only -r $commit)
            for file in $files
            do
                if [[ $file == frontend/* ]]
                then
                    isFrontendChanged=true
                elif [[ $file == component-attr-panel/* ]]
                then
                    isComponentAttrPanelChanged=true
                elif [[ $file == component-template/* ]]
                then
                    isComponentTemplateChanged=true
                fi
            done
        done
    fi
done

# 改動(dòng)的目錄需要執(zhí)行校驗(yàn)命令
execTask() {
    echo "root $1 pre-push"
    cd $1
    npm run type-check
}

if $isFrontendChanged
then
    execTask "frontend" & # 使用 & 讓任務(wù)在后臺(tái)執(zhí)行
    task1=$! # 保存任務(wù) id
fi

if $isComponentTemplateChanged
then
    execTask "component-template" &
    task2=$!
fi

if $isComponentAttrPanelChanged
then
    execTask "component-attr-panel" &
    task3=$!
fi

if [[ -n $task1 ]]; then
    wait $task1
fi

if [[ -n $task2 ]]; then
    wait $task2
fi

if [[ -n $task3 ]]; then
    wait $task3
fi

echo "All tasks finished."

測(cè)試一段時(shí)間后,發(fā)現(xiàn)第二個(gè)方案沒(méi)發(fā)生什么問(wèn)題,完全滿足需求。

PS:在寫(xiě)腳本的時(shí)候要注意各個(gè)任務(wù)是否能并發(fā)執(zhí)行,比如 lint-staged 這個(gè)任務(wù)就不能并發(fā)執(zhí)行,所以在編寫(xiě) pre-commit 腳本執(zhí)行代碼校驗(yàn)的時(shí)候,得改為串行。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-657835.html

到了這里,關(guān)于一個(gè) git 倉(cāng)庫(kù)下?lián)碛卸鄠€(gè)項(xiàng)目的 git hooks 配置方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • git在一臺(tái)電腦上配置不同的倉(cāng)庫(kù)(多個(gè)gitee倉(cāng)庫(kù)、或者不同的github倉(cāng)庫(kù))

    git在一臺(tái)電腦上配置不同的倉(cāng)庫(kù)(多個(gè)gitee倉(cāng)庫(kù)、或者不同的github倉(cāng)庫(kù))

    在開(kāi)發(fā)過(guò)程中,我們工作的時(shí)候難免會(huì)使用到兩個(gè)不同的倉(cāng)庫(kù),但是正常來(lái)說(shuō)一電腦默認(rèn)一個(gè)參考,直接會(huì)用全局命令 但是這樣只能配置一個(gè)倉(cāng)庫(kù)了,本文介紹在一臺(tái)電腦上配置多個(gè)倉(cāng)庫(kù),簡(jiǎn)單易用,請(qǐng)欣賞! 前提:您已經(jīng)掌握了git倉(cāng)庫(kù)命令,不需要很會(huì),有過(guò)配置用 CA證

    2024年02月13日
    瀏覽(24)
  • 一文教會(huì)你 如何在Github中創(chuàng)建倉(cāng)庫(kù)?如何將多個(gè)項(xiàng)目放到一個(gè)倉(cāng)庫(kù)中管理?如何將本地項(xiàng)目上傳到GitHub中?

    一文教會(huì)你 如何在Github中創(chuàng)建倉(cāng)庫(kù)?如何將多個(gè)項(xiàng)目放到一個(gè)倉(cāng)庫(kù)中管理?如何將本地項(xiàng)目上傳到GitHub中?

    一個(gè)混跡于Github、Stack Overflow、開(kāi)源中國(guó)、CSDN、博客園、稀土掘金、51CTO等 的野生程序員。 目標(biāo):分享更多的知識(shí),充實(shí)自己,幫助他人 GitHub公共倉(cāng)庫(kù):https://github.com/zhengyuzh 以github為主: 1、分享前端+后端基礎(chǔ)知識(shí) 2、前后端框架知識(shí)+框架使用分析 3、熱門前端+后端面試題

    2024年01月17日
    瀏覽(21)
  • 如何從一個(gè)git服務(wù)器倉(cāng)庫(kù)將項(xiàng)目遷移到另一個(gè)git服務(wù)器倉(cāng)庫(kù)

    如何從一個(gè)git服務(wù)器倉(cāng)庫(kù)將項(xiàng)目遷移到另一個(gè)git服務(wù)器倉(cāng)庫(kù)

    最近服務(wù)器遷移涉及到代碼也需要一塊遷移,梳理了一些git服務(wù)遷移指令,希望大家共享??(從服務(wù)器A遷移到服務(wù)器B) 1. 首先將服務(wù)器A上的代碼進(jìn)行備份 1.1 git備份指令【從A服務(wù)器(https://gitlab.xxxx.cn)上clone代碼到本地】 ???? git clone --bare https://gitlab.xxxx.cn/front/ifix

    2024年02月11日
    瀏覽(23)
  • SpringBoot項(xiàng)目配置多個(gè)RabbitMQ解決方案

    目前有一個(gè)Spring Boot項(xiàng)目,已經(jīng)接入一個(gè)RabbitMQ Broker,由于業(yè)務(wù)擴(kuò)展,需要新增一個(gè)RabbitMQ Broker進(jìn)行消費(fèi),由于單個(gè)Broker時(shí)通過(guò)Spring默認(rèn)配置進(jìn)行使用,因此需要做出修改 pom 增加properties配置 增加配置類 增加properties配置 修改配置類

    2024年02月11日
    瀏覽(23)
  • git 將本地已有的一個(gè)項(xiàng)目上傳到新建的git倉(cāng)庫(kù)的方法

    將本地已有的一個(gè)非git項(xiàng)目上傳到新建的git倉(cāng)庫(kù)的方法一共有兩種 第一種方法比較簡(jiǎn)單,直接用把遠(yuǎn)程倉(cāng)庫(kù)拉到本地,然后再把自己本地的項(xiàng)目拷貝到倉(cāng)庫(kù)中去。然后push到遠(yuǎn)程倉(cāng)庫(kù)上去即可。 此方法適用于本地項(xiàng)目不是一個(gè)git倉(cāng)庫(kù)的情況。 具體步驟如下: 1、首先克隆 1

    2024年02月04日
    瀏覽(21)
  • 手把手教你如何擁有自己的git倉(cāng)庫(kù)(國(guó)內(nèi)版碼云)

    手把手教你如何擁有自己的git倉(cāng)庫(kù)(國(guó)內(nèi)版碼云)

    碼云(Gitee)簡(jiǎn)介: ??碼云(Gitee)是 開(kāi)源中國(guó)社區(qū)推出的代碼托管協(xié)作開(kāi)發(fā)平臺(tái),支持Git,提供免費(fèi)的私有倉(cāng)庫(kù)托管 。Gitee目前已經(jīng)成為國(guó)內(nèi)最大的代碼托管平臺(tái)。幫助開(kāi)發(fā)者存儲(chǔ)和管理其項(xiàng)目源代碼,且能夠追蹤、記錄并控制用戶對(duì)其代碼的修改,提供穩(wěn)定、高效、安

    2024年02月15日
    瀏覽(22)
  • Git 如何將一個(gè)項(xiàng)目的代碼放到一個(gè)新的倉(cāng)庫(kù)中,但不在新的倉(cāng)庫(kù)中顯示舊的提交記錄

    場(chǎng)景:我想把RuoYi的代碼放到一個(gè)新的倉(cāng)庫(kù)里,放進(jìn)去之后,這個(gè)倉(cāng)庫(kù)會(huì)顯示RuoYi之前的所有提交,如何不顯示這些舊的提交? 有時(shí)候,我們可能需要將一個(gè)項(xiàng)目的代碼放到一個(gè)新的倉(cāng)庫(kù)中,但是我們又不想在新的倉(cāng)庫(kù)中顯示舊的提交記錄。這可能是因?yàn)榕f的提交記錄包含一

    2024年02月07日
    瀏覽(31)
  • 【Git】第一次將本地項(xiàng)目倉(cāng)庫(kù)推代碼到空的遠(yuǎn)程倉(cāng)庫(kù)方法以及報(bào)錯(cuò)的解決方案

    【Git】第一次將本地項(xiàng)目倉(cāng)庫(kù)推代碼到空的遠(yuǎn)程倉(cāng)庫(kù)方法以及報(bào)錯(cuò)的解決方案

    完成上述三步之后,在彈出來(lái)的對(duì)話框中選擇自己的項(xiàng)目目錄, 點(diǎn)確定,就可以在文件管理器中看到目錄下生成了一個(gè)隱藏目錄 “ .git ” 右鍵項(xiàng)目目錄,找到Git,根據(jù)圖示找到remote 在彈出來(lái)的對(duì)話框中,輸入自己遠(yuǎn)程倉(cāng)庫(kù)的地址 點(diǎn)擊ok,輸入驗(yàn)證信息,連接完畢。 點(diǎn)擊p

    2024年02月15日
    瀏覽(33)
  • IntelliJ IDEA - 一篇解決如何多模塊項(xiàng)目提交到同一個(gè) Git 倉(cāng)庫(kù)

    IntelliJ IDEA - 一篇解決如何多模塊項(xiàng)目提交到同一個(gè) Git 倉(cāng)庫(kù)

    事情是這樣的,最近新建了一個(gè)項(xiàng)目(多模塊),這個(gè)不必多說(shuō)大家就知道長(zhǎng)什么樣子(文件結(jié)構(gòu)),問(wèn)題是在我寫(xiě)完后想提交項(xiàng)目到 Git 倉(cāng)庫(kù)時(shí),發(fā)現(xiàn)每個(gè)模塊都要設(shè)置 Remote Git 地址,那么相當(dāng)于是把每一個(gè)模塊獨(dú)立一個(gè) Git 倉(cāng)庫(kù)地址,這個(gè)是我這個(gè)項(xiàng)目中不希望出現(xiàn)的(當(dāng)

    2024年02月15日
    瀏覽(85)
  • 服務(wù)器上一個(gè)域名對(duì)應(yīng)多個(gè)前端項(xiàng)目的nginx轉(zhuǎn)發(fā)配置

    服務(wù)器上一個(gè)域名對(duì)應(yīng)多個(gè)前端項(xiàng)目的nginx轉(zhuǎn)發(fā)配置

    場(chǎng)景: 當(dāng)有兩個(gè)前端項(xiàng)目A,B的時(shí)候,項(xiàng)目A(對(duì)應(yīng)端口8000)和項(xiàng)目B(對(duì)應(yīng)端口8001)分別部署在服務(wù)器的不同位置,通過(guò)服務(wù)器ip+端口都能正常訪問(wèn)單獨(dú)的項(xiàng)目A和項(xiàng)目B;現(xiàn)在要求兩個(gè)項(xiàng)目共用一個(gè)域名~~也就是說(shuō)訪問(wèn)http://10.111.182.xxx:8000的時(shí)候默認(rèn)訪問(wèn)項(xiàng)目A的資源,訪問(wèn)htt

    2024年02月05日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包