下面介绍 :
一、.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-commit
和 src/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. 使用说明
-
将此脚本保存为
update-hooks.sh
并放在项目根目录。 -
确保脚本有执行权限,运行以下命令:
bashchmod +x update-hooks.sh
-
每次需要更新 pre-commit 钩子时,运行脚本:
bash./update-hooks.sh
2. 如何管理内容
- 在
PRE_COMMIT_CONTENT
变量中添加你的钩子逻辑,比如代码格式化、lint 或运行测试等。 - 运行此脚本后,
pre-commit
钩子的内容会同时更新到.git/hooks/pre-commit
和src/my-ui/.husky/pre-commit
文件。
3. 验证脚本是否生效
检查 .git/hooks/pre-commit
文件
-
查看文件是否已创建并内容正确:
bashcat .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
-
验证文件是否可执行:
bashls -l .git/hooks/pre-commit
你应该看到
-rwxr-xr-x
权限,表示文件可执行。
检查 src/my-ui/.husky/pre-commit
文件
-
查看
src/my-ui/.husky/pre-commit
文件内容:bashcat src/my-ui/.husky/pre-commit
内容应该与
.git/hooks/pre-commit
相同。 -
验证文件权限:
bashls -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
-
创建或修改一个文件。
-
尝试提交更改:
sqlgit add . git commit -m "Test pre-commit hook"
-
如果钩子生效,终端会输出
Running pre-commit hook...
,并运行pnpm lint
命令。
测试 src/my-ui/.husky/pre-commit
-
如果你的项目配置了
husky
,可以通过运行以下命令测试钩子:sqlpnpm husky add src/my-ui/.husky/pre-commit "echo 'Husky pre-commit hook test'"
-
提交代码,看是否运行新的逻辑。
脚本作用
- 脚本运行后会同步两个位置的
pre-commit
文件,避免手动管理。 - 你可以通过运行和观察测试结果,验证钩子是否按照预期运行。
二、update.hooks.sh 脚本 , 还需要在 scripts里面加命令么
js
"scripts": {
"prepare": "husky install"
}
如果你已经有了 update-hooks.sh
脚本并用它来统一更新 Git 钩子和 Husky 配置,那么在 scripts
中添加 "prepare": "husky install"
是 不必要的。以下是原因和场景分析:
为什么不需要再添加 "prepare": "husky install"
?
-
update-hooks.sh
脚本已经覆盖了钩子配置:- 你的脚本
update-hooks.sh
会自动更新.git/hooks/pre-commit
和src/my-ui/.husky/pre-commit
。 - 这使得 Husky 的初始化由脚本集中管理,无需额外的
prepare
脚本。
- 你的脚本
-
避免冲突和重复:
- 如果同时存在
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
:
-
不要在
scripts
中添加prepare
:- 通过运行
./update-hooks.sh
管理钩子。 - 确保团队成员在每次拉取代码后运行此脚本。
- 通过运行
-
更新项目文档:
- 在团队文档中明确说明,需要运行
./update-hooks.sh
来初始化钩子。
- 在团队文档中明确说明,需要运行
如果更喜欢自动化方式(不使用脚本):
-
移除
update-hooks.sh
:-
在
src/my-ui/package.json
中添加以下内容:json"scripts": { "prepare": "husky install src/my-ui/.husky" }
-
每次运行
pnpm install
时,钩子会自动安装。
-
-
手动运行 Husky 命令初始化:
bashcd src/my-ui pnpm install
总结
- 如果你有
update-hooks.sh
,就 不需要 再添加"prepare"
脚本。 - 如果想要更自动化的流程并愿意移除脚本,则可以使用
"prepare": "husky install"
。