{"id":29142065,"url":"https://github.com/ethanz-code/commit-lint","last_synced_at":"2026-05-05T11:38:16.475Z","repository":{"id":278515008,"uuid":"934838823","full_name":"ethanz-code/commit-lint","owner":"ethanz-code","description":"使用 commitlint, commitizen, husky, prettier, eslint, lint-staged 来为团队打造最佳的 git 规范提交体验。","archived":false,"fork":false,"pushed_at":"2025-02-20T06:52:00.000Z","size":23370,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-24T12:53:12.416Z","etag":null,"topics":["commitizen","commitlint","eslint","git","pritter"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ethanz-code.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-02-18T13:41:34.000Z","updated_at":"2025-02-20T06:54:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"af392a12-4f50-4c9d-9569-c1363b31296b","html_url":"https://github.com/ethanz-code/commit-lint","commit_stats":null,"previous_names":["yassine-zhang/commit-lint","ethanz-code/commit-lint"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ethanz-code/commit-lint","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethanz-code%2Fcommit-lint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethanz-code%2Fcommit-lint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethanz-code%2Fcommit-lint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethanz-code%2Fcommit-lint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ethanz-code","download_url":"https://codeload.github.com/ethanz-code/commit-lint/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethanz-code%2Fcommit-lint/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262834787,"owners_count":23371849,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["commitizen","commitlint","eslint","git","pritter"],"created_at":"2025-06-30T19:05:45.474Z","updated_at":"2026-05-05T11:38:16.431Z","avatar_url":"https://github.com/ethanz-code.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# commit-lint\n\n[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\n## 从完全空项目开始一步步搭建\n\n\u003cimg src=\"./assets/gif/git-normalized-commit-demo.gif\" alt=\"git-normalized-commit-demo\" width=\"800\" /\u003e\n\n### 安装 bun 包管理器\n\nLinux\u0026MacOS\n\n```bash\ncurl -fsSL https://bun.sh/install | bash\n```\n\nWindows\n\n```bash\npowershell -c \"irm bun.sh/install.ps1 | iex\"\n```\n\n之所以不使用 npm 反而用 bun 是因为 npm 安装依赖太慢了，而 bun 安装依赖非常快。另外 bun 不只是一个包管理器，它是一个现代的 JavaScript 和 TypeScript 运行时，兼容 Node.js 的 API。\n\n### 项目初始化工作\n\n```bash\n# 1. 创建一个新的项目目录\nmkdir commit-lint\n\n# 2. 进入项目目录\ncd commit-lint\n\n# 3. git 初始化\ngit init\n\n# 4. 添加远程仓库\ngit remote add origin https://github.com/your-repo/commit-lint.git\n\n# 5. 初始化一个新的 bun 项目\nbun init\n```\n\n### 安装 husky 用作 git 钩子\n\n```bash\n# 1. 安装 husky 包\nbun add -D husky\n\n# 2. 初始化 husky，\n#（1）会生成 .husky 目录，在目录内部有 _ 文件夹和 pre-commit 案例脚本文件；\n#（2）_ 文件夹里存放了 husky 可以提供的一些钩子的默认脚本， husky-cli 使用文件等；\n#（3）自动在 package.json 中添加了\n#     \"scripts\": {\n#       \"prepare\": \"husky\"\n#     }；\nbunx husky init\n```\n\n### 安装 prettier 用作代码美化\n\n1. 安装 prettier 包\n\n```bash\nbun add -D prettier\n```\n\n2. 在项目根目录下创建 .prettierrc 文件用于配置 prettier 的规则，在线 playground 地址：https://prettier.io/playground/ ，可以直接点击网站左下角 Copy config Json按钮复制规则并粘贴到 .prettierrc 文件中\n\n如下是默认规则 json 文件内容：\n\n```json\n{\n  \"arrowParens\": \"always\",\n  \"bracketSameLine\": false,\n  \"bracketSpacing\": true,\n  \"semi\": true,\n  \"experimentalTernaries\": false,\n  \"singleQuote\": false,\n  \"jsxSingleQuote\": false,\n  \"quoteProps\": \"as-needed\",\n  \"trailingComma\": \"all\",\n  \"singleAttributePerLine\": false,\n  \"htmlWhitespaceSensitivity\": \"css\",\n  \"vueIndentScriptAndStyle\": false,\n  \"proseWrap\": \"preserve\",\n  \"insertPragma\": false,\n  \"printWidth\": 80,\n  \"requirePragma\": false,\n  \"tabWidth\": 2,\n  \"useTabs\": false,\n  \"embeddedLanguageFormatting\": \"auto\"\n}\n```\n\n3. 在项目根目录接着创建 .prettierignore 文件用于配置 prettier 忽略的文件，我的配置如下：\n\n```json\n# prettier doesn't respect newlines between chained methods\n# https://github.com/prettier/prettier/issues/7884\n**/*.spec.js\n**/*.spec.ts\n**/dist\n# https://github.com/prettier/prettier/issues/5246\n**/*.html\n```\n\n【提示】\n\n之后你可以使用 `bunx prettier --write .` 命令来格式化代码，使用 `bunx prettier --check .` 命令来检查代码是否符合 prettier 的规则。\n\n### 安装 eslint 用作代码检查\n\n```bash\nbun create @eslint/config@latest\n```\n\n使用上述命令安装后，会生成 eslint.config.js 配置文件，然后你就可以使用 `bunx eslint --fix` 命令来检查代码并自动修复语法错误。\n\n\u003cimg src=\"./assets/gif/eslint-install.gif\" alt=\"eslint-install\" width=\"600\" /\u003e\n\n### 安装 lint-staged 用作 git 提交前检查\n\n1. 安装 lint-staged 包\n\n```bash\nbun add -D lint-staged\n```\n\n2. 在项目根目录下创建 .lintstagedrc 文件用于配置 lint-staged 的规则，我的配置如下：\n\n```json\n{\n  \"*.{js,cjs,mjs,md,ts,vue,json,css}\": [\n    \"bunx prettier --write\",\n    \"bunx eslint --fix\"\n  ]\n}\n```\n\n3. 新建 .husky/pre-commit 文件使其在 git 提交之前触发，内容如下：\n\n- 运行 lint-staged 检查代码格式和语法\n- 获取暂存的文件列表\n- 重新添加文件（如果有修改）\n- 允许提交继续\n\n```sh\n#!/usr/bin/env sh\n\n# 只运行 lint-staged\nbunx lint-staged\n\n# 获取暂存的文件列表\nfiles=$(git diff --cached --name-only --diff-filter=ACM | tr '\\n' ' ')\n\n# 重新添加文件（如果有修改）\nif [ -n \"$files\" ]; then\n  git add $files\nfi\n\n# 允许提交继续\nexit 0\n```\n\n【提示】\n\n以防无权执行，在 Linux 和 MacOS 系统中建议使用 `chmod +x .husky/pre-commit` 命令赋予执行权限。\n\n**到目前为止，你成功实现了 git 提交前检查代码格式和语法，并自动修复了语法错误。**\n\n### 安装 commitizen 以及相关 Adapter\n\n1. 安装 commitizen 包和相关依赖\n\n```bash\nbun add -D commitizen cz-conventional-changelog\n```\n\n2. 在 package.json 中添加 json 配置，\n   （1）添加 commit-cz 命令可随时使用 `bun run commit-cz` 命令来交互式提交代码\n   （2）添加用于配置 commitizen 的规则\n\n```json\n{\n  \"scripts\": {\n    \"commit-cz\": \"cz\"\n  },\n  \"config\": {\n    \"commitizen\": {\n      \"path\": \"./node_modules/cz-conventional-changelog\"\n    }\n  }\n}\n```\n\n3. 新建 .husky/prepare-commit-msg 文件使其在 git 提交信息前触发，它在 pre-commit 之后执行，内容如下：\n\n```sh\n#!/usr/bin/env sh\n\n# 如果是 merge 或者 rebase 等操作，跳过 commitizen\nif [ -n \"$2\" ]; then\n  echo \"跳过 commitizen，因为存在 $1 操作\"\n  exit 0\nfi\n\n# 使用 commitizen 进行交互式提交\nexec \u003c /dev/tty \u0026\u0026 bunx cz --hook || true\n```\n\n【提示】\n\n以防无权执行，在 Linux 和 MacOS 系统中建议使用 `chmod +x .husky/prepare-commit-msg` 命令赋予执行权限。\n\n### 安装 commitlint 用作 git 提交信息验证\n\n1. 安装 commitlint 包和相关依赖\n\n```bash\nbun add -D @commitlint/config-conventional @commitlint/cli\n```\n\n2. 在项目根目录下创建 commitlint.config.js 文件用于配置 commitlint 的规则，我的配置如下：\n\n```js\nexport default {\n  extends: [\"@commitlint/config-conventional\"],\n\n  rules: {\n    \"type-enum\": [\n      2,\n      \"always\",\n      [\n        \"feat\",\n        \"fix\",\n        \"docs\",\n        \"style\",\n        \"refactor\",\n        \"perf\",\n        \"test\",\n        \"chore\",\n        \"revert\",\n        \"build\",\n      ],\n    ],\n    \"type-case\": [2, \"always\", \"lower-case\"],\n    \"type-empty\": [2, \"never\"],\n    \"scope-empty\": [0, \"never\"],\n    \"subject-empty\": [2, \"never\"],\n    \"subject-full-stop\": [2, \"never\", \".\"],\n    \"header-max-length\": [2, \"always\", 100],\n  },\n};\n```\n\n3. 在 package.json 中添加 commitlint 命令，可随时使用 `bun run commitlint` 命令来检查你上次的 git 提交信息是否符合规范\n\n```json\n{\n  \"scripts\": {\n    \"commitlint\": \"commitlint --edit\"\n  }\n}\n```\n\n4. 新建 .husky/commit-msg 文件使其在 git 提交信息时触发，内容如下：\n\n```sh\n#!/usr/bin/env sh\n\n# 使用 commitlint 做检查\nbunx --bun commitlint --edit \"$1\"\n```\n\n【提示】\n\n以防无权执行，在 Linux 和 MacOS 系统中建议使用 `chmod +x .husky/commit-msg` 命令赋予执行权限。\n\n## 注意事项\n\n2025年2月19日再次搭建跑通这一过程，所有包均使用当日最新版本，重点的几个包版本号如下：\n\nSystem: MacOS 15.2\n\n- husky: ^8.0.0\n- prettier: ^3.5.1\n- eslint: ^9.20.1\n- lint-staged: ^15.4.3\n- commitizen: ^4.3.1\n- cz-conventional-changelog: ^3.3.0\n- @commitlint/config-conventional: ^18.4.3\n- @commitlint/cli: ^18.4.3\n\n如果你发现这种方法跑不通，可能是系统原因或包版本问题，请自行调整。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fethanz-code%2Fcommit-lint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fethanz-code%2Fcommit-lint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fethanz-code%2Fcommit-lint/lists"}