使用场景:
* 用户想对指定目录进行管理,每次只导出差异文件
* 用户想对导出的差异文件进行自定义处理
shell脚本如下:
#!/bin/bash# 功能说明:# 用户输入 Git 项目目录,如果不存在,则退出。# 检查目录是否是 Git 仓库,如果不是,则:# 执行 git init 进行 Git 初始化。# 创建 .gitignore 文件(如果不存在),并确保 .DS_Store 被忽略。# 获取所有未提交的变更文件(已修改 + 新增),并去重。# 如果没有差异文件,则提示并退出,避免执行不必要的操作。# 让用户输入导出目录,并确保它与 Git 项目目录处于同级目录。# 复制所有差异文件(包括目录结构)到目标目录。# 询问用户是否提交更改:# 如果用户选择提交,则执行 git add . 并让用户输入提交信息进行提交。# 如果用户不提交,则直接退出。# 1️⃣ 让用户输入 Git 项目目录路径read -p "请输入项目目录路径: " project_dirif [ ! -d "$project_dir" ]; thenecho "❌ 目录不存在: $project_dir"exit 1fi# 2️⃣ 进入项目目录,并获取其绝对路径project_dir="$(cd "$project_dir" && pwd)" # 绝对路径parent_dir="$(dirname "$project_dir")" # 获取上级目录# 3️⃣ 检查是否是 Git 仓库cd "$project_dir" || exit 1if [ ! -d ".git" ]; thenecho "⚠️ 该目录未进行 Git 初始化,正在初始化..."git init # 初始化 Git 仓库# 4️⃣ 创建 .gitignore 文件,并确保忽略 .DS_Storegitignore_file=".gitignore"if [ ! -f "$gitignore_file" ]; thenecho "📄 创建 .gitignore 文件..."echo "# 忽略 macOS 生成的系统文件" > "$gitignore_file"echo ".DS_Store" >> "$gitignore_file"echo "✅ .gitignore 文件已创建并添加 .DS_Store"else# 确保 .gitignore 已忽略 .DS_Storeif ! grep -q ".DS_Store" "$gitignore_file"; thenecho ".DS_Store" >> "$gitignore_file"echo "✅ .gitignore 已更新,添加 .DS_Store"fifiecho "✅ Git 初始化完成!"# echo "⚠️ 请手动添加文件并提交后再运行此脚本导出差异文件。"# exit 0fi# 5️⃣ 获取所有未提交的差异文件(包括修改和新增的)git diff --name-only > /tmp/changed_files.txt # 获取未提交的已修改文件git diff --cached --name-only >> /tmp/changed_files.txt # 获取暂存区中的文件git status --porcelain | awk '{print $2}' >> /tmp/changed_files.txt # 获取未跟踪的文件# 6️⃣ 去重(去掉空行),存入 /tmp/filtered_files.txt,并排除 `.git` 和 `.gitignore`sort -u /tmp/changed_files.txt | grep -v '^$' | grep -v '^.git/' | grep -v '^.gitignore$' > /tmp/filtered_files.txt# 7️⃣ 判断是否有差异文件,如果没有则退出if [ ! -s /tmp/filtered_files.txt ]; thenecho "✅ 没有任何差异文件,操作完成!"exit 0fi# 8️⃣ 让用户输入导出目录read -p "请输入要导出的目标目录: " export_dir# 9️⃣ 处理导出目录路径,使其与 Git 项目目录处于同一级if [[ "$export_dir" != /* ]]; thenexport_dir="$parent_dir/$export_dir" # 转换为绝对路径,并确保和项目同级fimkdir -p "$export_dir" # 确保目标目录存在# 🔟 复制所有差异文件(保持原目录结构)echo "📂 正在导出差异文件到 $export_dir ..."while IFS= read -r path; doif [ -f "$path" ]; thenmkdir -p "$export_dir/$(dirname "$path")" # 创建目标目录cp "$path" "$export_dir/$path" # 复制文件elif [ -d "$path" ]; thenmkdir -p "$export_dir/$path" # 创建目录cp -r "$path/." "$export_dir/$path" # 复制整个目录fidone < /tmp/filtered_files.txtecho "✅ 差异文件已复制到: $export_dir"# 1️⃣1️⃣ 询问用户是否提交更改read -p "是否需要提交这些更改? (y/n): " commit_choiceif [ "$commit_choice" = "y" ]; thengit add . # 添加所有文件read -p "请输入提交信息: " commit_msggit commit -m "$commit_msg" # 提交更改echo "✅ 提交完成!"elseecho "🚀 退出,未提交更改。"fiexit 0