求可处理package.json依赖合并冲突并自动取最新版本的脚本
package.json依赖合并冲突自动修复方案
方案1:使用git内置merge驱动(无需额外写脚本,推荐)
git本身内置了专门用于处理package.json依赖冲突的merge驱动,直接配置即可实现冲突时自动取版本号更高的依赖:
- 全局开启配置:
git config --global merge.dependencyversionmerge.name "Merge package.json/bower.json dependencies by version number" git config --global merge.dependencyversionmerge.driver "git merge-file -L %P -L %P -L %P --ours %A %B %O | sed 's/<<<<<<<.*//;s/=======.*//;s/>>>>>>>.*//' | grep -v '^$' > %A"
- 项目根目录新建
.gitattributes文件,添加以下内容:
package.json merge=dependencyversionmerge package-lock.json merge=binary pnpm-lock.yaml merge=binary yarn.lock merge=binary
配置完成后,后续合并分支遇到package.json的依赖版本冲突时,会自动保留版本号更高的条目,完全符合你的需求。
方案2:自定义shell脚本(如果需要自定义逻辑)
可以直接使用以下shell脚本处理当前仓库里所有存在冲突的package.json文件:
#!/bin/bash # 处理所有存在git冲突的package.json文件 find . -name "package.json" -type f | while read -r file; do # 检查文件是否存在冲突标记 if grep -q "<<<<<<<" "$file"; then # 逐块处理冲突,对比两个版本号保留更大的 awk ' /<<<<<<</ { in_conflict=1; line1=""; line2=""; next } /=======/ { in_conflict=2; next } />>>>>>>/ { in_conflict=0; # 提取两个版本号 split(line1, a, "\""); ver1=a[4] split(line2, b, "\""); ver2=b[4] # 对比版本号,输出更大的那个 cmd = "printf \"%s\\n%s\\n\" \"" ver1 "\" \"" ver2 "\" | sort -rV | head -n1" cmd | getline max_ver close(cmd) if (max_ver == ver1) { print line1 } else { print line2 } next } in_conflict == 1 { line1 = $0 } in_conflict == 2 { line2 = $0 } in_conflict == 0 { print $0 } ' "$file" > "$file.tmp" && mv "$file.tmp" "$file" echo "已处理冲突:$file" fi done
脚本使用方法:
- 将上述内容保存为
fix-package-json-conflict.sh - 赋予执行权限:
chmod +x fix-package-json-conflict.sh - 仓库根目录执行即可自动处理所有package.json的依赖冲突
注意:处理完冲突后需要重新安装依赖生成对应的锁文件,避免依赖版本不一致。
内容的提问来源于stack exchange,提问作者tnrich
相关产品推荐
相关产品推荐

