[{"data":1,"prerenderedAt":1426},["ShallowReactive",2],{"post-thinking/commitlint-practice":3},{"id":4,"title":5,"body":6,"date":1417,"description":1418,"extension":1419,"meta":1420,"navigation":376,"path":1421,"seo":1422,"stem":1423,"tags":1424,"__hash__":1425},"content/thinking/CommitLint实践与思考.md","CommitLint实践与思考",{"type":7,"value":8,"toc":1406},"minimark",[9,14,18,35,47,53,70,77,89,95,109,115,121,126,133,140,143,146,347,350,1391,1402],[10,11,13],"h1",{"id":12},"commitlint","CommitLint",[15,16,17],"h2",{"id":17},"提交规范工程化实践",[19,20,25],"pre",{"className":21,"code":22,"language":23,"meta":24,"style":24},"language-sh shiki shiki-themes github-light github-dark","pnpm add -D simple-git-hooks lint-staged @commitlint/cli @commitlint/config-conventional cz-git\n","sh","",[26,27,28],"code",{"__ignoreMap":24},[29,30,33],"span",{"class":31,"line":32},"line",1,[29,34,22],{},[36,37,39,40,43,44],"h4",{"id":38},"为什么使用commitlintcli-commitlintconfig-conventional","为什么使用",[26,41,42],{},"@commitlint/cli"," ",[26,45,46],{},"@commitlint/config-conventional",[48,49,50,52],"p",{},[26,51,42],{}," 用于提交信息校验",[48,54,55,57,58,61,62,69],{},[26,56,46],{},"用于使用",[26,59,60],{},"Conventional Commits","即 ",[63,64,68],"a",{"href":65,"rel":66},"https://www.conventionalcommits.org/zh-hans/v1.0.0/",[67],"nofollow","约定式提交"," 作为默认校验规则集",[36,71,73,74,76],{"id":72},"与commitlint的不同","与",[26,75,12],{},"的不同",[48,78,79,81,82,84,85,88],{},[26,80,12],{},"是旧的使用方式，官方推荐以这种按需引用的方式安装\n",[26,83,12],{},"提供了用于提示的插件，但功能上",[26,86,87],{},"cz-git","更全面",[36,90,39,92],{"id":91},"为什么使用simple-git-hooks",[26,93,94],{},"simple-git-hooks",[48,96,97,98,101,102,105,106,108],{},"提供轻量的",[26,99,100],{},"git hooks","\n相较",[26,103,104],{},"husky","，",[26,107,94],{},"无需配置开箱即用",[36,110,39,112],{"id":111},"为什么使用lint-staged",[26,113,114],{},"lint-staged",[48,116,117,118],{},"在预提交时触发 ",[26,119,120],{},"eslint --fix",[36,122,39,124],{"id":123},"为什么使用cz-git",[26,125,87],{},[48,127,128],{},[63,129,132],{"href":130,"rel":131},"https://cz-git.qbb.sh/zh/",[67],"cz-git | 一款工程性更强，轻量级，高度自定义，标准输出格式的 Commitizen 适配器",[48,134,135,136,139],{},"提供友好的命令行",[26,137,138],{},"git","提交体验，也可以集成 AI 来生成 commit",[15,141,142],{"id":142},"具体配置",[48,144,145],{},"package.json",[19,147,151],{"className":148,"code":149,"language":150,"meta":24,"style":24},"language-json shiki shiki-themes github-light github-dark","{\n  \"scripts\": {\n    \"build\": \"vite build\",\n    \"dev\": \"vite --port 3333 --open\",\n    \"lint\": \"eslint .\",\n    \"postinstall\": \"npx simple-git-hooks\",\n    \"commit\": \"cz-git\"\n  },\n  \"simple-git-hooks\": {\n    \"pre-commit\": \"pnpm lint-staged\",\n    \"commit-msg\": \"pnpm commitlint --edit\"\n  },\n  \"lint-staged\": {\n    \"*\": \"eslint --fix\"\n  },\n  \"config\": {\n    \"commitizen\": {\n      \"path\": \"node_modules/cz-git\"\n    }\n  }\n}\n","json",[26,152,153,159,169,185,198,211,224,235,241,249,262,273,278,286,297,302,310,318,329,335,341],{"__ignoreMap":24},[29,154,155],{"class":31,"line":32},[29,156,158],{"class":157},"sVt8B","{\n",[29,160,162,166],{"class":31,"line":161},2,[29,163,165],{"class":164},"sj4cs","  \"scripts\"",[29,167,168],{"class":157},": {\n",[29,170,172,175,178,182],{"class":31,"line":171},3,[29,173,174],{"class":164},"    \"build\"",[29,176,177],{"class":157},": ",[29,179,181],{"class":180},"sZZnC","\"vite build\"",[29,183,184],{"class":157},",\n",[29,186,188,191,193,196],{"class":31,"line":187},4,[29,189,190],{"class":164},"    \"dev\"",[29,192,177],{"class":157},[29,194,195],{"class":180},"\"vite --port 3333 --open\"",[29,197,184],{"class":157},[29,199,201,204,206,209],{"class":31,"line":200},5,[29,202,203],{"class":164},"    \"lint\"",[29,205,177],{"class":157},[29,207,208],{"class":180},"\"eslint .\"",[29,210,184],{"class":157},[29,212,214,217,219,222],{"class":31,"line":213},6,[29,215,216],{"class":164},"    \"postinstall\"",[29,218,177],{"class":157},[29,220,221],{"class":180},"\"npx simple-git-hooks\"",[29,223,184],{"class":157},[29,225,227,230,232],{"class":31,"line":226},7,[29,228,229],{"class":164},"    \"commit\"",[29,231,177],{"class":157},[29,233,234],{"class":180},"\"cz-git\"\n",[29,236,238],{"class":31,"line":237},8,[29,239,240],{"class":157},"  },\n",[29,242,244,247],{"class":31,"line":243},9,[29,245,246],{"class":164},"  \"simple-git-hooks\"",[29,248,168],{"class":157},[29,250,252,255,257,260],{"class":31,"line":251},10,[29,253,254],{"class":164},"    \"pre-commit\"",[29,256,177],{"class":157},[29,258,259],{"class":180},"\"pnpm lint-staged\"",[29,261,184],{"class":157},[29,263,265,268,270],{"class":31,"line":264},11,[29,266,267],{"class":164},"    \"commit-msg\"",[29,269,177],{"class":157},[29,271,272],{"class":180},"\"pnpm commitlint --edit\"\n",[29,274,276],{"class":31,"line":275},12,[29,277,240],{"class":157},[29,279,281,284],{"class":31,"line":280},13,[29,282,283],{"class":164},"  \"lint-staged\"",[29,285,168],{"class":157},[29,287,289,292,294],{"class":31,"line":288},14,[29,290,291],{"class":164},"    \"*\"",[29,293,177],{"class":157},[29,295,296],{"class":180},"\"eslint --fix\"\n",[29,298,300],{"class":31,"line":299},15,[29,301,240],{"class":157},[29,303,305,308],{"class":31,"line":304},16,[29,306,307],{"class":164},"  \"config\"",[29,309,168],{"class":157},[29,311,313,316],{"class":31,"line":312},17,[29,314,315],{"class":164},"    \"commitizen\"",[29,317,168],{"class":157},[29,319,321,324,326],{"class":31,"line":320},18,[29,322,323],{"class":164},"      \"path\"",[29,325,177],{"class":157},[29,327,328],{"class":180},"\"node_modules/cz-git\"\n",[29,330,332],{"class":31,"line":331},19,[29,333,334],{"class":157},"    }\n",[29,336,338],{"class":31,"line":337},20,[29,339,340],{"class":157},"  }\n",[29,342,344],{"class":31,"line":343},21,[29,345,346],{"class":157},"}\n",[48,348,349],{},"commitlint.config.mjs",[19,351,355],{"className":352,"code":353,"language":354,"meta":24,"style":24},"language-js shiki shiki-themes github-light github-dark","import { defineConfig } from 'cz-git'\n\nexport default defineConfig({\n  rules: {\n    // @see: https://commitlint.js.org/#/reference-rules\n    'type-enum': [2, 'always', ['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore', 'perf', 'build', 'ci', 'revert']], // type 类型必须在以下类型范围内\n    'type-case': [2, 'always', 'lower-case'], // type 必须使用小写\n    'type-empty': [2, 'never'], // type 不能为空\n\n    // 'scope-enum': [2, 'always', ['login', 'user', 'api']], // scope 范围必须在以下范围范围内\n    'scope-case': [2, 'always', 'lower-case'], // scope 必须使用小写\n    'scope-empty': [0], // scope 可以为空\n\n    'subject-empty': [2, 'never'], // 描述内容不能为空\n    'subject-full-stop': [2, 'never', ['.', '，', '。', ',', ';', '；']], // 描述内容禁止以标点符号结尾\n\n    'header-max-length': [2, 'always', 100], // 头部最大长度\n  },\n  prompt: {\n    alias: { fd: 'docs: fix typos' },\n    messages: {\n      type: '选择你要提交的类型 :',\n      scope: '选择一个提交范围（可选）:',\n      customScope: '请输入自定义的提交范围 :',\n      subject: '填写简短精炼的变更描述 :\\n',\n      body: '填写更加详细的变更描述（可选）。使用 \"|\" 换行 :\\n',\n      breaking: '列举非兼容性重大的变更（可选）。使用 \"|\" 换行 :\\n',\n      footerPrefixesSelect: '选择关联issue前缀（可选）:',\n      customFooterPrefix: '输入自定义issue前缀 :',\n      footer: '列举关联issue (可选) 例如: #31, #I3244 :\\n',\n      confirmCommit: '是否提交或修改commit ?',\n    },\n    types: [\n      { value: 'feat', name: '1) feat:    ✨ 新功能', emoji: ':sparkles:' },\n      { value: 'fix', name: '2) fix:     🐛 Bug修复', emoji: ':bug:' },\n      { value: 'docs', name: '3) docs:    📝 文档变更', emoji: ':memo:' },\n      { value: 'style', name: '4) style:   💄 不影响逻辑的代码格式调整', emoji: ':lipstick:' },\n      { value: 'refactor', name: '5) refactor: ♻️ 重构（修改代码结构、变量名、函数名）', emoji: ':recycle:' },\n      { value: 'perf', name: '6) perf:    ⚡️ 性能优化', emoji: ':zap:' },\n      { value: 'test', name: '7) test:    ✅ 测试用例', emoji: ':white_check_mark:' },\n      { value: 'build', name: '8) build:   📦️ 修改项目构建系统（修改依赖库、外部接口或者升级 Node 版本）', emoji: ':package:' },\n      { value: 'ci', name: '9) ci:      🎡 持续集成', emoji: ':ferris_wheel:' },\n      { value: 'chore', name: '0) chore:   🔨 非业务性代码的修改（构建过程或辅助工具变更）', emoji: ':hammer:' },\n      { value: 'revert', name: '/) revert:  ⏪️ 回滚', emoji: ':rewind:' },\n    ],\n    useEmoji: true,\n    emojiAlign: 'center',\n    useAI: false,\n    aiNumber: 1,\n    themeColorCode: '',\n    scopes: [],\n    allowCustomScopes: true,\n    allowEmptyScopes: true,\n    customScopesAlign: 'top',\n    customScopesAlias: 'custom',\n    emptyScopesAlias: 'empty',\n    upperCaseSubject: false,\n    markBreakingChangeMode: false,\n    allowBreakingChanges: ['feat', 'fix'],\n    breaklineNumber: 100,\n    breaklineChar: '|',\n    skipQuestions: ['body', 'footer', 'footerPrefix', 'breaking'],\n    issuePrefixes: [{ value: 'closed', name: 'closed:   ISSUES has been processed' }],\n    customIssuePrefixAlign: 'top',\n    emptyIssuePrefixAlias: 'skip',\n    customIssuePrefixAlias: 'custom',\n    allowCustomIssuePrefix: true,\n    allowEmptyIssuePrefix: true,\n    confirmColorize: true,\n    scopeOverrides: undefined,\n    defaultBody: '',\n    defaultIssues: '',\n    defaultScope: '',\n    defaultSubject: '',\n  },\n})\n","js",[26,356,357,372,378,393,398,404,483,507,526,530,538,560,575,579,597,645,649,672,676,681,692,697,708,719,730,747,762,777,788,799,814,825,831,837,859,878,897,916,935,954,973,992,1011,1030,1049,1055,1066,1077,1088,1099,1110,1116,1126,1136,1147,1158,1169,1179,1189,1204,1214,1225,1251,1268,1278,1289,1299,1309,1319,1329,1340,1350,1360,1370,1380,1385],{"__ignoreMap":24},[29,358,359,363,366,369],{"class":31,"line":32},[29,360,362],{"class":361},"szBVR","import",[29,364,365],{"class":157}," { defineConfig } ",[29,367,368],{"class":361},"from",[29,370,371],{"class":180}," 'cz-git'\n",[29,373,374],{"class":31,"line":161},[29,375,377],{"emptyLinePlaceholder":376},true,"\n",[29,379,380,383,386,390],{"class":31,"line":171},[29,381,382],{"class":361},"export",[29,384,385],{"class":361}," default",[29,387,389],{"class":388},"sScJk"," defineConfig",[29,391,392],{"class":157},"({\n",[29,394,395],{"class":31,"line":187},[29,396,397],{"class":157},"  rules: {\n",[29,399,400],{"class":31,"line":200},[29,401,403],{"class":402},"sJ8bj","    // @see: https://commitlint.js.org/#/reference-rules\n",[29,405,406,409,412,415,418,421,424,427,429,432,434,437,439,442,444,447,449,452,454,457,459,462,464,467,469,472,474,477,480],{"class":31,"line":213},[29,407,408],{"class":180},"    'type-enum'",[29,410,411],{"class":157},": [",[29,413,414],{"class":164},"2",[29,416,417],{"class":157},", ",[29,419,420],{"class":180},"'always'",[29,422,423],{"class":157},", [",[29,425,426],{"class":180},"'feat'",[29,428,417],{"class":157},[29,430,431],{"class":180},"'fix'",[29,433,417],{"class":157},[29,435,436],{"class":180},"'docs'",[29,438,417],{"class":157},[29,440,441],{"class":180},"'style'",[29,443,417],{"class":157},[29,445,446],{"class":180},"'refactor'",[29,448,417],{"class":157},[29,450,451],{"class":180},"'test'",[29,453,417],{"class":157},[29,455,456],{"class":180},"'chore'",[29,458,417],{"class":157},[29,460,461],{"class":180},"'perf'",[29,463,417],{"class":157},[29,465,466],{"class":180},"'build'",[29,468,417],{"class":157},[29,470,471],{"class":180},"'ci'",[29,473,417],{"class":157},[29,475,476],{"class":180},"'revert'",[29,478,479],{"class":157},"]], ",[29,481,482],{"class":402},"// type 类型必须在以下类型范围内\n",[29,484,485,488,490,492,494,496,498,501,504],{"class":31,"line":226},[29,486,487],{"class":180},"    'type-case'",[29,489,411],{"class":157},[29,491,414],{"class":164},[29,493,417],{"class":157},[29,495,420],{"class":180},[29,497,417],{"class":157},[29,499,500],{"class":180},"'lower-case'",[29,502,503],{"class":157},"], ",[29,505,506],{"class":402},"// type 必须使用小写\n",[29,508,509,512,514,516,518,521,523],{"class":31,"line":237},[29,510,511],{"class":180},"    'type-empty'",[29,513,411],{"class":157},[29,515,414],{"class":164},[29,517,417],{"class":157},[29,519,520],{"class":180},"'never'",[29,522,503],{"class":157},[29,524,525],{"class":402},"// type 不能为空\n",[29,527,528],{"class":31,"line":243},[29,529,377],{"emptyLinePlaceholder":376},[29,531,532,535],{"class":31,"line":251},[29,533,534],{"class":402},"    // 'scope-enum': [2, 'always', ['login', 'user', 'api']],",[29,536,537],{"class":402}," // scope 范围必须在以下范围范围内\n",[29,539,540,543,545,547,549,551,553,555,557],{"class":31,"line":264},[29,541,542],{"class":180},"    'scope-case'",[29,544,411],{"class":157},[29,546,414],{"class":164},[29,548,417],{"class":157},[29,550,420],{"class":180},[29,552,417],{"class":157},[29,554,500],{"class":180},[29,556,503],{"class":157},[29,558,559],{"class":402},"// scope 必须使用小写\n",[29,561,562,565,567,570,572],{"class":31,"line":275},[29,563,564],{"class":180},"    'scope-empty'",[29,566,411],{"class":157},[29,568,569],{"class":164},"0",[29,571,503],{"class":157},[29,573,574],{"class":402},"// scope 可以为空\n",[29,576,577],{"class":31,"line":280},[29,578,377],{"emptyLinePlaceholder":376},[29,580,581,584,586,588,590,592,594],{"class":31,"line":288},[29,582,583],{"class":180},"    'subject-empty'",[29,585,411],{"class":157},[29,587,414],{"class":164},[29,589,417],{"class":157},[29,591,520],{"class":180},[29,593,503],{"class":157},[29,595,596],{"class":402},"// 描述内容不能为空\n",[29,598,599,602,604,606,608,610,612,615,617,620,622,625,627,630,632,635,637,640,642],{"class":31,"line":299},[29,600,601],{"class":180},"    'subject-full-stop'",[29,603,411],{"class":157},[29,605,414],{"class":164},[29,607,417],{"class":157},[29,609,520],{"class":180},[29,611,423],{"class":157},[29,613,614],{"class":180},"'.'",[29,616,417],{"class":157},[29,618,619],{"class":180},"'，'",[29,621,417],{"class":157},[29,623,624],{"class":180},"'。'",[29,626,417],{"class":157},[29,628,629],{"class":180},"','",[29,631,417],{"class":157},[29,633,634],{"class":180},"';'",[29,636,417],{"class":157},[29,638,639],{"class":180},"'；'",[29,641,479],{"class":157},[29,643,644],{"class":402},"// 描述内容禁止以标点符号结尾\n",[29,646,647],{"class":31,"line":304},[29,648,377],{"emptyLinePlaceholder":376},[29,650,651,654,656,658,660,662,664,667,669],{"class":31,"line":312},[29,652,653],{"class":180},"    'header-max-length'",[29,655,411],{"class":157},[29,657,414],{"class":164},[29,659,417],{"class":157},[29,661,420],{"class":180},[29,663,417],{"class":157},[29,665,666],{"class":164},"100",[29,668,503],{"class":157},[29,670,671],{"class":402},"// 头部最大长度\n",[29,673,674],{"class":31,"line":320},[29,675,240],{"class":157},[29,677,678],{"class":31,"line":331},[29,679,680],{"class":157},"  prompt: {\n",[29,682,683,686,689],{"class":31,"line":337},[29,684,685],{"class":157},"    alias: { fd: ",[29,687,688],{"class":180},"'docs: fix typos'",[29,690,691],{"class":157}," },\n",[29,693,694],{"class":31,"line":343},[29,695,696],{"class":157},"    messages: {\n",[29,698,700,703,706],{"class":31,"line":699},22,[29,701,702],{"class":157},"      type: ",[29,704,705],{"class":180},"'选择你要提交的类型 :'",[29,707,184],{"class":157},[29,709,711,714,717],{"class":31,"line":710},23,[29,712,713],{"class":157},"      scope: ",[29,715,716],{"class":180},"'选择一个提交范围（可选）:'",[29,718,184],{"class":157},[29,720,722,725,728],{"class":31,"line":721},24,[29,723,724],{"class":157},"      customScope: ",[29,726,727],{"class":180},"'请输入自定义的提交范围 :'",[29,729,184],{"class":157},[29,731,733,736,739,742,745],{"class":31,"line":732},25,[29,734,735],{"class":157},"      subject: ",[29,737,738],{"class":180},"'填写简短精炼的变更描述 :",[29,740,741],{"class":164},"\\n",[29,743,744],{"class":180},"'",[29,746,184],{"class":157},[29,748,750,753,756,758,760],{"class":31,"line":749},26,[29,751,752],{"class":157},"      body: ",[29,754,755],{"class":180},"'填写更加详细的变更描述（可选）。使用 \"|\" 换行 :",[29,757,741],{"class":164},[29,759,744],{"class":180},[29,761,184],{"class":157},[29,763,765,768,771,773,775],{"class":31,"line":764},27,[29,766,767],{"class":157},"      breaking: ",[29,769,770],{"class":180},"'列举非兼容性重大的变更（可选）。使用 \"|\" 换行 :",[29,772,741],{"class":164},[29,774,744],{"class":180},[29,776,184],{"class":157},[29,778,780,783,786],{"class":31,"line":779},28,[29,781,782],{"class":157},"      footerPrefixesSelect: ",[29,784,785],{"class":180},"'选择关联issue前缀（可选）:'",[29,787,184],{"class":157},[29,789,791,794,797],{"class":31,"line":790},29,[29,792,793],{"class":157},"      customFooterPrefix: ",[29,795,796],{"class":180},"'输入自定义issue前缀 :'",[29,798,184],{"class":157},[29,800,802,805,808,810,812],{"class":31,"line":801},30,[29,803,804],{"class":157},"      footer: ",[29,806,807],{"class":180},"'列举关联issue (可选) 例如: #31, #I3244 :",[29,809,741],{"class":164},[29,811,744],{"class":180},[29,813,184],{"class":157},[29,815,817,820,823],{"class":31,"line":816},31,[29,818,819],{"class":157},"      confirmCommit: ",[29,821,822],{"class":180},"'是否提交或修改commit ?'",[29,824,184],{"class":157},[29,826,828],{"class":31,"line":827},32,[29,829,830],{"class":157},"    },\n",[29,832,834],{"class":31,"line":833},33,[29,835,836],{"class":157},"    types: [\n",[29,838,840,843,845,848,851,854,857],{"class":31,"line":839},34,[29,841,842],{"class":157},"      { value: ",[29,844,426],{"class":180},[29,846,847],{"class":157},", name: ",[29,849,850],{"class":180},"'1) feat:    ✨ 新功能'",[29,852,853],{"class":157},", emoji: ",[29,855,856],{"class":180},"':sparkles:'",[29,858,691],{"class":157},[29,860,862,864,866,868,871,873,876],{"class":31,"line":861},35,[29,863,842],{"class":157},[29,865,431],{"class":180},[29,867,847],{"class":157},[29,869,870],{"class":180},"'2) fix:     🐛 Bug修复'",[29,872,853],{"class":157},[29,874,875],{"class":180},"':bug:'",[29,877,691],{"class":157},[29,879,881,883,885,887,890,892,895],{"class":31,"line":880},36,[29,882,842],{"class":157},[29,884,436],{"class":180},[29,886,847],{"class":157},[29,888,889],{"class":180},"'3) docs:    📝 文档变更'",[29,891,853],{"class":157},[29,893,894],{"class":180},"':memo:'",[29,896,691],{"class":157},[29,898,900,902,904,906,909,911,914],{"class":31,"line":899},37,[29,901,842],{"class":157},[29,903,441],{"class":180},[29,905,847],{"class":157},[29,907,908],{"class":180},"'4) style:   💄 不影响逻辑的代码格式调整'",[29,910,853],{"class":157},[29,912,913],{"class":180},"':lipstick:'",[29,915,691],{"class":157},[29,917,919,921,923,925,928,930,933],{"class":31,"line":918},38,[29,920,842],{"class":157},[29,922,446],{"class":180},[29,924,847],{"class":157},[29,926,927],{"class":180},"'5) refactor: ♻️ 重构（修改代码结构、变量名、函数名）'",[29,929,853],{"class":157},[29,931,932],{"class":180},"':recycle:'",[29,934,691],{"class":157},[29,936,938,940,942,944,947,949,952],{"class":31,"line":937},39,[29,939,842],{"class":157},[29,941,461],{"class":180},[29,943,847],{"class":157},[29,945,946],{"class":180},"'6) perf:    ⚡️ 性能优化'",[29,948,853],{"class":157},[29,950,951],{"class":180},"':zap:'",[29,953,691],{"class":157},[29,955,957,959,961,963,966,968,971],{"class":31,"line":956},40,[29,958,842],{"class":157},[29,960,451],{"class":180},[29,962,847],{"class":157},[29,964,965],{"class":180},"'7) test:    ✅ 测试用例'",[29,967,853],{"class":157},[29,969,970],{"class":180},"':white_check_mark:'",[29,972,691],{"class":157},[29,974,976,978,980,982,985,987,990],{"class":31,"line":975},41,[29,977,842],{"class":157},[29,979,466],{"class":180},[29,981,847],{"class":157},[29,983,984],{"class":180},"'8) build:   📦️ 修改项目构建系统（修改依赖库、外部接口或者升级 Node 版本）'",[29,986,853],{"class":157},[29,988,989],{"class":180},"':package:'",[29,991,691],{"class":157},[29,993,995,997,999,1001,1004,1006,1009],{"class":31,"line":994},42,[29,996,842],{"class":157},[29,998,471],{"class":180},[29,1000,847],{"class":157},[29,1002,1003],{"class":180},"'9) ci:      🎡 持续集成'",[29,1005,853],{"class":157},[29,1007,1008],{"class":180},"':ferris_wheel:'",[29,1010,691],{"class":157},[29,1012,1014,1016,1018,1020,1023,1025,1028],{"class":31,"line":1013},43,[29,1015,842],{"class":157},[29,1017,456],{"class":180},[29,1019,847],{"class":157},[29,1021,1022],{"class":180},"'0) chore:   🔨 非业务性代码的修改（构建过程或辅助工具变更）'",[29,1024,853],{"class":157},[29,1026,1027],{"class":180},"':hammer:'",[29,1029,691],{"class":157},[29,1031,1033,1035,1037,1039,1042,1044,1047],{"class":31,"line":1032},44,[29,1034,842],{"class":157},[29,1036,476],{"class":180},[29,1038,847],{"class":157},[29,1040,1041],{"class":180},"'/) revert:  ⏪️ 回滚'",[29,1043,853],{"class":157},[29,1045,1046],{"class":180},"':rewind:'",[29,1048,691],{"class":157},[29,1050,1052],{"class":31,"line":1051},45,[29,1053,1054],{"class":157},"    ],\n",[29,1056,1058,1061,1064],{"class":31,"line":1057},46,[29,1059,1060],{"class":157},"    useEmoji: ",[29,1062,1063],{"class":164},"true",[29,1065,184],{"class":157},[29,1067,1069,1072,1075],{"class":31,"line":1068},47,[29,1070,1071],{"class":157},"    emojiAlign: ",[29,1073,1074],{"class":180},"'center'",[29,1076,184],{"class":157},[29,1078,1080,1083,1086],{"class":31,"line":1079},48,[29,1081,1082],{"class":157},"    useAI: ",[29,1084,1085],{"class":164},"false",[29,1087,184],{"class":157},[29,1089,1091,1094,1097],{"class":31,"line":1090},49,[29,1092,1093],{"class":157},"    aiNumber: ",[29,1095,1096],{"class":164},"1",[29,1098,184],{"class":157},[29,1100,1102,1105,1108],{"class":31,"line":1101},50,[29,1103,1104],{"class":157},"    themeColorCode: ",[29,1106,1107],{"class":180},"''",[29,1109,184],{"class":157},[29,1111,1113],{"class":31,"line":1112},51,[29,1114,1115],{"class":157},"    scopes: [],\n",[29,1117,1119,1122,1124],{"class":31,"line":1118},52,[29,1120,1121],{"class":157},"    allowCustomScopes: ",[29,1123,1063],{"class":164},[29,1125,184],{"class":157},[29,1127,1129,1132,1134],{"class":31,"line":1128},53,[29,1130,1131],{"class":157},"    allowEmptyScopes: ",[29,1133,1063],{"class":164},[29,1135,184],{"class":157},[29,1137,1139,1142,1145],{"class":31,"line":1138},54,[29,1140,1141],{"class":157},"    customScopesAlign: ",[29,1143,1144],{"class":180},"'top'",[29,1146,184],{"class":157},[29,1148,1150,1153,1156],{"class":31,"line":1149},55,[29,1151,1152],{"class":157},"    customScopesAlias: ",[29,1154,1155],{"class":180},"'custom'",[29,1157,184],{"class":157},[29,1159,1161,1164,1167],{"class":31,"line":1160},56,[29,1162,1163],{"class":157},"    emptyScopesAlias: ",[29,1165,1166],{"class":180},"'empty'",[29,1168,184],{"class":157},[29,1170,1172,1175,1177],{"class":31,"line":1171},57,[29,1173,1174],{"class":157},"    upperCaseSubject: ",[29,1176,1085],{"class":164},[29,1178,184],{"class":157},[29,1180,1182,1185,1187],{"class":31,"line":1181},58,[29,1183,1184],{"class":157},"    markBreakingChangeMode: ",[29,1186,1085],{"class":164},[29,1188,184],{"class":157},[29,1190,1192,1195,1197,1199,1201],{"class":31,"line":1191},59,[29,1193,1194],{"class":157},"    allowBreakingChanges: [",[29,1196,426],{"class":180},[29,1198,417],{"class":157},[29,1200,431],{"class":180},[29,1202,1203],{"class":157},"],\n",[29,1205,1207,1210,1212],{"class":31,"line":1206},60,[29,1208,1209],{"class":157},"    breaklineNumber: ",[29,1211,666],{"class":164},[29,1213,184],{"class":157},[29,1215,1217,1220,1223],{"class":31,"line":1216},61,[29,1218,1219],{"class":157},"    breaklineChar: ",[29,1221,1222],{"class":180},"'|'",[29,1224,184],{"class":157},[29,1226,1228,1231,1234,1236,1239,1241,1244,1246,1249],{"class":31,"line":1227},62,[29,1229,1230],{"class":157},"    skipQuestions: [",[29,1232,1233],{"class":180},"'body'",[29,1235,417],{"class":157},[29,1237,1238],{"class":180},"'footer'",[29,1240,417],{"class":157},[29,1242,1243],{"class":180},"'footerPrefix'",[29,1245,417],{"class":157},[29,1247,1248],{"class":180},"'breaking'",[29,1250,1203],{"class":157},[29,1252,1254,1257,1260,1262,1265],{"class":31,"line":1253},63,[29,1255,1256],{"class":157},"    issuePrefixes: [{ value: ",[29,1258,1259],{"class":180},"'closed'",[29,1261,847],{"class":157},[29,1263,1264],{"class":180},"'closed:   ISSUES has been processed'",[29,1266,1267],{"class":157}," }],\n",[29,1269,1271,1274,1276],{"class":31,"line":1270},64,[29,1272,1273],{"class":157},"    customIssuePrefixAlign: ",[29,1275,1144],{"class":180},[29,1277,184],{"class":157},[29,1279,1281,1284,1287],{"class":31,"line":1280},65,[29,1282,1283],{"class":157},"    emptyIssuePrefixAlias: ",[29,1285,1286],{"class":180},"'skip'",[29,1288,184],{"class":157},[29,1290,1292,1295,1297],{"class":31,"line":1291},66,[29,1293,1294],{"class":157},"    customIssuePrefixAlias: ",[29,1296,1155],{"class":180},[29,1298,184],{"class":157},[29,1300,1302,1305,1307],{"class":31,"line":1301},67,[29,1303,1304],{"class":157},"    allowCustomIssuePrefix: ",[29,1306,1063],{"class":164},[29,1308,184],{"class":157},[29,1310,1312,1315,1317],{"class":31,"line":1311},68,[29,1313,1314],{"class":157},"    allowEmptyIssuePrefix: ",[29,1316,1063],{"class":164},[29,1318,184],{"class":157},[29,1320,1322,1325,1327],{"class":31,"line":1321},69,[29,1323,1324],{"class":157},"    confirmColorize: ",[29,1326,1063],{"class":164},[29,1328,184],{"class":157},[29,1330,1332,1335,1338],{"class":31,"line":1331},70,[29,1333,1334],{"class":157},"    scopeOverrides: ",[29,1336,1337],{"class":164},"undefined",[29,1339,184],{"class":157},[29,1341,1343,1346,1348],{"class":31,"line":1342},71,[29,1344,1345],{"class":157},"    defaultBody: ",[29,1347,1107],{"class":180},[29,1349,184],{"class":157},[29,1351,1353,1356,1358],{"class":31,"line":1352},72,[29,1354,1355],{"class":157},"    defaultIssues: ",[29,1357,1107],{"class":180},[29,1359,184],{"class":157},[29,1361,1363,1366,1368],{"class":31,"line":1362},73,[29,1364,1365],{"class":157},"    defaultScope: ",[29,1367,1107],{"class":180},[29,1369,184],{"class":157},[29,1371,1373,1376,1378],{"class":31,"line":1372},74,[29,1374,1375],{"class":157},"    defaultSubject: ",[29,1377,1107],{"class":180},[29,1379,184],{"class":157},[29,1381,1383],{"class":31,"line":1382},75,[29,1384,240],{"class":157},[29,1386,1388],{"class":31,"line":1387},76,[29,1389,1390],{"class":157},"})\n",[48,1392,1393,1394,1397,1398,1401],{},"运行 ",[26,1395,1396],{},"pnpm postinstall"," 后，使用 ",[26,1399,1400],{},"pnpm cz"," 即可触发提交交互",[1403,1404,1405],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":24,"searchDepth":187,"depth":187,"links":1407},[1408,1416],{"id":17,"depth":161,"text":17,"children":1409},[1410,1412,1413,1414,1415],{"id":38,"depth":187,"text":1411},"为什么使用@commitlint/cli @commitlint/config-conventional",{"id":72,"depth":187,"text":72},{"id":91,"depth":187,"text":91},{"id":111,"depth":187,"text":111},{"id":123,"depth":187,"text":123},{"id":142,"depth":161,"text":142},"2025-05-22","完备的Git CommitLint实践以及为什么这么做","md",{},"/thinking/commitlint-practice",{"title":5,"description":1418},"thinking/CommitLint实践与思考",[138],"h2Jv78wChs9Y28XA6gfzXe0Ujm6e3UeMDoXmjFbkGAA",1776757930516]