MokiMoki

Simple git hook

6 分钟阅读
-- 阅读
-- 评论

前言: 为了同组内规范化git的提交记录,并且可以自定义一些commit内容,约束提交规范,以及自动生成一些 change log prefix;

Packages

npm install cz-git commitizen simple-git-hooks @commitlint/cli @commitlint/config-conventional

Introduce

@commitlint/cli, @commitlint/config-conventional

官网地址

为了提供一些commit-msg的规范,以及prompt,约束git提交的信息,比如约束提交前缀:

[
  'build',
  'chore',
  'ci',
  'docs',
  'feat',
  'fix',
  'perf',
  'refactor',
  'revert',
  'style',
  'test'
];

cz-git

Github

提供可视化的操作git提交的方式;

simple-git-hooks

Github

husky 更加轻量级,简单的git hook管理包;

关于git hook的介绍请看官方文档 -> Git

Start

下载依赖并且写入配置:

npm install cz-git commitizen simple-git-hooks @commitlint/cli @commitlint/config-conventional;
npm pkg set scripts.prepare="npx simple-git-hooks"
npx simple-git-hooks
npm pkg set scripts.commitlint="commitlint --edit"
npm pkg set scripts.cz="git add . && git-cz"

其他配置:

{
     // package.json
  	"scripts": {
      	"commitlint": "commitlint --edit",
        "cz": "git add . && git-cz",
        "prepare": "npx simple-git-hooks"
    },
    "simple-git-hooks": {
      	"pre-commit": "<pre-commit hook:做一些需要在commit前的操作,比如结合 biome/eslint 检查代码>",
        "commit-msg": "npx --no-install commitlint --edit ${1}",
        "preserveUnused": ["commit-msg"]
    },
    "config": {
      "commitizen": {
        // 指定cz-git为使用的适配器
        "path": "node_modules/cz-git"
      }
    }
}

然后复制至commitlint.config.js:

/** @type {import('cz-git').UserConfig} */
module.exports = {
	extends: ["@commitlint/config-conventional"],
	prompt: {
		alias: {
			f: "docs: fix typos",
			r: "docs: update README",
			s: "style: update code format",
			b: "build: bump dependencies",
			c: "chore: update config",
		},
		messages: {
			type: "选择你要提交的类型 :",
			scope: "选择一个提交范围(可选):",
			customScope: "请输入自定义的提交范围 :",
			subject: "填写简短精炼的变更描述 :\n",
			body: '填写更加详细的变更描述(可选)。使用 "|" 换行 :\n',
			breaking: '列举非兼容性重大的变更(可选)。使用 "|" 换行 :\n',
			footerPrefixesSelect: "选择关联issue前缀(可选):",
			customFooterPrefix: "输入自定义issue前缀 :",
			footer: "列举关联issue (可选) 例如: #31, #I3244 :\n",
			confirmCommit: "是否提交或修改commit ?",
		},
		types: [
			{
				value: "feat",
				name: "feat:      ✨  新增功能 | A new feature",
				emoji: "✨",
			},
			{ value: "fix", name: "fix:       🐞 修复缺陷 | A bug fix", emoji: "🐞" },
			{
				value: "docs",
				name: "docs:      📝 文档更新 | Documentation only changes",
				emoji: "📝",
			},
			{
				value: "style",
				name: "style:     💄 代码格式 | Changes that do not affect the meaning of the code",
				emoji: "💄",
			},
			{
				value: "refactor",
				name: "refactor:  ♻️ 代码重构 | A code change that neither fixes a bug nor adds a feature",
				emoji: "♻️",
			},
			{
				value: "perf",
				name: "perf:      ⚡️ 性能提升 | A code change that improves performance",
				emoji: "⚡️",
			},
			{
				value: "test",
				name: "test:      ✅  测试相关 | Adding missing tests or correcting existing tests",
				emoji: "✅",
			},
			{
				value: "build",
				name: "build:     📦️构建相关 | Changes that affect the build system or external dependencies",
				emoji: "📦️",
			},
			{
				value: "ci",
				name: "ci:        🎡 持续集成 | Changes to our CI configuration files and scripts",
				emoji: "🎡",
			},
			{
				value: "revert",
				name: "revert:    🔨 回退代码 | Revert to a commit",
				emoji: "🔨",
			},
			{
				value: "chore",
				name: "chore:     ⏪️ 其他修改 | Other changes that do not modify src or test files",
				emoji: "⏪️",
			},
		],
		useEmoji: true,
		emojiAlign: "center",
		useAI: false,
		aiNumber: 1,
		themeColorCode: "",
		scopes: [],
		allowCustomScopes: true,
		allowEmptyScopes: true,
		customScopesAlign: "bottom",
		customScopesAlias: "custom",
		emptyScopesAlias: "empty",
		upperCaseSubject: false,
		markBreakingChangeMode: false,
		allowBreakingChanges: ["feat", "fix"],
		breaklineNumber: 100,
		breaklineChar: "|",
		skipQuestions: [],
		issuePrefixes: [
			{ value: "closed", name: "closed:   ISSUES has been processed" },
		],
		customIssuePrefixAlign: "top",
		emptyIssuePrefixAlias: "skip",
		customIssuePrefixAlias: "custom",
		allowCustomIssuePrefix: true,
		allowEmptyIssuePrefix: true,
		confirmColorize: true,
		scopeOverrides: undefined,
		defaultBody: "",
		defaultIssues: "",
		defaultScope: "",
		defaultSubject: "",
	},
};

检查git hooks path

git config core.hooksPath

如果hooks path不在 .git/hooks下,请依次执行如下命令:

git config core.hooksPath .git/hooks/
npx simple-git-hooks

评论 (0)

使用 GitHub 登录后发表评论

Loading...

Simple git hook | Moki