有什么方法可以防止 commintng package-lock.json unless package.json has changed?

Is there any way to prevent from commintng package-lock.json unless package.json has changed?

这几天有一个问题就是无意中推package-lock.json

例如)

我在我的功能分支中 运行 npm install 并且我的 package-lock.json 已更新。

我进行了提交,我的功能分支被合并到开发分支中。 开发分支中的Package-lock.json我的功能分支中的package-lock.json覆盖。

由于 package-lock.json 中的更新包,它破坏了应用程序。


我知道我必须小心不要推送 package-lock.json 除非 package.json 已经改变,但是,有时我会忘记。

所以我在想,如果我只提交 package-lock.json,我是否可以在预提交中添加一些规则以显示一些警告。有什么办法可以实现吗?

谢谢

如果您已经在使用 Git 钩子,例如 "pre-commit",您基本上可以在 "pre-commit" 列表中再添加一个脚本,然后编写一个脚本来执行您需要的操作(代码如下).

使用 git/grep 命令的组合,您可以检查暂存文件列表中是否存在 "package.json" 和 "package-lock.json"(或者其中 none ).

脚本可以是:

#!/bin/sh
if [ `git diff --name-only --cached | egrep -c 'package.json|package.lock.json'` == "0" -o `git diff --name-only --cached | egrep -c 'package.json|package.lock.json'` == "2" ]; then
  echo "Checked successfully."
elif [ `git diff --name-only --cached | egrep -c 'package.json'` == "1" -a `git diff --name-only --cached | egrep -c 'package.lock.json'` == "0" ]; then
  echo "Warning: you are committing package.json without package.lock.json"
else
  echo "Error: make sure you commit BOTH package.json and package.lock.json"
  exit 1
fi
exit 0

git diff --name-only --cached 获取暂存文件列表(仅文件名)

| 使用上一个命令的结果作为下一个命令的参数

egrep 执行搜索(在本例中搜索字符串 'package.json' 和 'package.lock.json')

-c统计匹配数

用反引号包裹整个命令将执行它并将结果提供给主脚本。

git+egrep 命令的结果returns 找到的出现次数。然后检查结果是什么,告诉脚本继续 (exit 0) 或退出 (exit 1)。

使脚本文件可执行,并在 package.json:

中添加对它的引用
"scripts": {
  "check-package": "./bin/check-package.sh",
}
...
"pre-commit": [
  "check-package"
]

应该就是了!

完成后,请确保首先只提交脚本,然后 package.json(否则它已经在寻找脚本,但找不到)。

最后说明: 此方法可有效检查暂存文件列表中需要同时存在的任何 2 个或更多文件。