如何用Git恢复仅修改A.json的文件夹变更,排除同时改B.json的情况
实现Git修改文件的选择性恢复脚本
针对你的需求,完全可以通过Bash脚本实现。核心思路是先获取所有已修改的文件,按文件夹分组后判断修改情况,只恢复仅修改了A.json的文件夹。
脚本代码
#!/bin/bash # 获取所有已修改的文件路径列表 modified_files=$(git diff --name-only) # 用关联数组存储每个文件夹的修改文件类型(A/B) declare -A folder_change_status # 遍历每个修改文件,记录对应文件夹的修改状态 for file in $modified_files; do folder_path=$(dirname "$file") file_name=$(basename "$file") if [[ "$file_name" == "A.json" ]]; then folder_change_status["$folder_path"]+="A" elif [[ "$file_name" == "B.json" ]]; then folder_change_status["$folder_path"]+="B" fi done # 遍历所有有修改的文件夹,执行选择性恢复 for folder in "${!folder_change_status[@]}"; do status=${folder_change_status["$folder"]} # 仅当文件夹下只有A.json被修改时,执行恢复 if [[ "$status" == "A" ]]; then echo "正在恢复文件夹: $folder" git checkout "$folder" fi done
脚本说明
- 获取修改文件:
git diff --name-only会输出所有已修改但未提交的文件路径,过滤掉diff的具体内容,只保留路径信息。 - 分组记录修改状态:通过
dirname提取每个文件的父文件夹路径,用关联数组记录每个文件夹下修改的是A.json还是B.json——如果同时修改两个文件,数组值会是AB,仅修改A则是A。 - 执行选择性恢复:遍历所有有修改的文件夹,仅当状态为
A时,执行git checkout恢复该文件夹的所有内容。
使用注意事项
- 请在Git仓库的根目录下执行脚本
- 首次测试时,可以注释掉
git checkout "$folder"这一行,先查看echo输出的恢复列表是否符合预期,确认无误后再取消注释执行实际恢复 - 脚本支持嵌套子文件夹,无论层级多少,都会正确识别每个文件的直接父文件夹
内容的提问来源于stack exchange,提问作者Wenda Jiang
相关产品推荐
相关产品推荐

