【pre-commit/husky】配置

下面介绍 :

一、.git 跟 package.json 不在同一级目录下,怎么初始化husky 以及 同一配置 ~~
js 复制代码
projectRoot/
├── .git/
├── .gitignore
├── .nx
├── deploy/.gitkeep
├── src/
            ├── my-service/
                        |── src/
                       ├── mvnw.cmd
                        ├── pom.xml

            
            ├── my-ui/
                       ├── node_modules
                       ├── package.json 
                        |── src/
                        ├── pnpm-lock.yaml

my-ui 目录位于 src/ 子目录下,因此 my-ui 目录的相对路径到 .git 目录是 ../../.git。

基于.git 跟 package.json 不在同一层的目录,这种情况下, 如果在多人协作的项目中, 不可能让每个人都去.git/hooks/pre-commit 和 root/src/my-ui/.husky/pre-commit

这两个文件下去修改内容, 所以还是需要一个执行脚本去生成。

以下是一个脚本,用于统一管理和自动设置 pre-commit 钩子,以便在多人协作的项目中避免手动修改两个文件的内容。我们可以创建一个脚本,自动将 pre-commit 钩子同步到 .git/hooks/pre-commitsrc/my-ui/.husky/pre-commit 文件中。

脚本内容

bash 复制代码
#!/bin/bash

# Define paths
GIT_HOOKS_PATH=".git/hooks/pre-commit"
HUSKY_HOOK_PATH="src/my-ui/.husky/pre-commit"

# Define the common pre-commit content
PRE_COMMIT_CONTENT="#!/bin/sh
# Pre-commit hook to ensure consistent behavior in both locations
echo 'Running pre-commit hook...'
# Add your custom commands here, e.g., linting, formatting, tests
pnpm lint
"

# Function to create or update the hook file
update_hook() {
  local hook_path=$1
  echo "Updating $hook_path..."
  # Ensure the parent directory exists
  mkdir -p "$(dirname "$hook_path")"
  # Write the content to the hook file
  echo "$PRE_COMMIT_CONTENT" > "$hook_path"
  # Make the hook file executable
  chmod +x "$hook_path"
}

# Update both hooks
update_hook "$GIT_HOOKS_PATH"
update_hook "$HUSKY_HOOK_PATH"

echo "Pre-commit hooks have been updated successfully."

1. 使用说明

  1. 将此脚本保存为 update-hooks.sh 并放在项目根目录。

  2. 确保脚本有执行权限,运行以下命令:

    bash 复制代码
    chmod +x update-hooks.sh
  3. 每次需要更新 pre-commit 钩子时,运行脚本:

    bash 复制代码
    ./update-hooks.sh

2. 如何管理内容

  • PRE_COMMIT_CONTENT 变量中添加你的钩子逻辑,比如代码格式化、lint 或运行测试等。
  • 运行此脚本后,pre-commit 钩子的内容会同时更新到 .git/hooks/pre-commitsrc/my-ui/.husky/pre-commit 文件。

3. 验证脚本是否生效

检查 .git/hooks/pre-commit 文件
  1. 查看文件是否已创建并内容正确:

    bash 复制代码
    cat .git/hooks/pre-commit

    期望输出为 PRE_COMMIT_CONTENT 中定义的内容,例如:

    bash 复制代码
    #!/bin/sh
    # Pre-commit hook to ensure consistent behavior in both locations
    echo 'Running pre-commit hook...'
    pnpm lint
  2. 验证文件是否可执行:

    bash 复制代码
    ls -l .git/hooks/pre-commit

    你应该看到 -rwxr-xr-x 权限,表示文件可执行。

检查 src/my-ui/.husky/pre-commit 文件
  1. 查看 src/my-ui/.husky/pre-commit 文件内容:

    bash 复制代码
    cat src/my-ui/.husky/pre-commit

    内容应该与 .git/hooks/pre-commit 相同。

  2. 验证文件权限:

    bash 复制代码
    ls -l src/my-ui/.husky/pre-commit

    确保它也有可执行权限。输出应显示 -rwxr-xr-x 权限,表示文件是可执行的。

如果权限不足,运行以下命令手动修复:

js 复制代码
chmod +x .git/hooks/pre-commit src/my-ui/.husky/pre-commit

4. 测试钩子

测试 .git/hooks/pre-commit
  1. 创建或修改一个文件。

  2. 尝试提交更改:

    sql 复制代码
    git add .
    git commit -m "Test pre-commit hook"
  3. 如果钩子生效,终端会输出 Running pre-commit hook...,并运行 pnpm lint 命令。

测试 src/my-ui/.husky/pre-commit
  1. 如果你的项目配置了 husky,可以通过运行以下命令测试钩子:

    sql 复制代码
    pnpm husky add src/my-ui/.husky/pre-commit "echo 'Husky pre-commit hook test'"
  2. 提交代码,看是否运行新的逻辑。


脚本作用

  • 脚本运行后会同步两个位置的 pre-commit 文件,避免手动管理。
  • 你可以通过运行和观察测试结果,验证钩子是否按照预期运行。

二、update.hooks.sh 脚本 , 还需要在 scripts里面加命令么

js 复制代码
"scripts": {
    "prepare": "husky install" 
}

如果你已经有了 update-hooks.sh 脚本并用它来统一更新 Git 钩子和 Husky 配置,那么在 scripts 中添加 "prepare": "husky install"不必要的。以下是原因和场景分析:


为什么不需要再添加 "prepare": "husky install"

  1. update-hooks.sh 脚本已经覆盖了钩子配置:

    • 你的脚本 update-hooks.sh 会自动更新 .git/hooks/pre-commitsrc/my-ui/.husky/pre-commit
    • 这使得 Husky 的初始化由脚本集中管理,无需额外的 prepare 脚本。
  2. 避免冲突和重复:

    • 如果同时存在 update-hooks.sh"prepare": "husky install",可能导致路径或行为上的冲突。
    • 统一管理钩子的方式更清晰(即只通过 update-hooks.sh 来初始化或更新)。

何时需要 "prepare": "husky install"

  • 如果没有 update-hooks.sh 脚本:

    • 此时,需要通过 prepare 脚本确保 Husky 钩子自动安装到 .git/hooks
  • 团队需要自动化安装流程:

    • 如果团队成员克隆项目后直接运行 pnpm install,自动完成 Husky 初始化是一个便利的选择。

推荐方案

如果保留 update-hooks.sh
  1. 不要在 scripts 中添加 prepare

    • 通过运行 ./update-hooks.sh 管理钩子。
    • 确保团队成员在每次拉取代码后运行此脚本。
  2. 更新项目文档:

    • 在团队文档中明确说明,需要运行 ./update-hooks.sh 来初始化钩子。
如果更喜欢自动化方式(不使用脚本):
  1. 移除 update-hooks.sh

    • src/my-ui/package.json 中添加以下内容:

      json 复制代码
      "scripts": {
        "prepare": "husky install src/my-ui/.husky"
      }
    • 每次运行 pnpm install 时,钩子会自动安装。

  2. 手动运行 Husky 命令初始化:

    bash 复制代码
    cd src/my-ui
    pnpm install

总结

  • 如果你有 update-hooks.sh,就 不需要 再添加 "prepare" 脚本。
  • 如果想要更自动化的流程并愿意移除脚本,则可以使用 "prepare": "husky install"
相关推荐
GISer_Jing2 小时前
前端面试通关:Cesium+Three+React优化+TypeScript实战+ECharts性能方案
前端·react.js·面试
落霞的思绪3 小时前
CSS复习
前端·css
咖啡の猫5 小时前
Shell脚本-for循环应用案例
前端·chrome
百万蹄蹄向前冲7 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
朝阳5818 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路8 小时前
GeoTools 读取影像元数据
前端
ssshooter9 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
Jerry9 小时前
Jetpack Compose 中的状态
前端
dae bal10 小时前
关于RSA和AES加密
前端·vue.js
柳杉10 小时前
使用three.js搭建3d隧道监测-2
前端·javascript·数据可视化