使用场景:
* 用户想对指定目录进行管理,每次只导出差异文件
* 用户想对导出的差异文件进行自定义处理

shell脚本如下:

#!/bin/bash

# 功能说明:
# 用户输入 Git 项目目录,如果不存在,则退出。
# 检查目录是否是 Git 仓库,如果不是,则:
# 执行 git init 进行 Git 初始化。
# 创建 .gitignore 文件(如果不存在),并确保 .DS_Store 被忽略。
# 获取所有未提交的变更文件(已修改 + 新增),并去重。
# 如果没有差异文件,则提示并退出,避免执行不必要的操作。
# 让用户输入导出目录,并确保它与 Git 项目目录处于同级目录。
# 复制所有差异文件(包括目录结构)到目标目录。
# 询问用户是否提交更改:
# 如果用户选择提交,则执行 git add . 并让用户输入提交信息进行提交。
# 如果用户不提交,则直接退出。

# 1️⃣ 让用户输入 Git 项目目录路径
read -p "请输入项目目录路径: " project_dir
if [ ! -d "$project_dir" ]; then
echo "❌ 目录不存在: $project_dir"
exit 1
fi

# 2️⃣ 进入项目目录,并获取其绝对路径
project_dir="$(cd "$project_dir" && pwd)" # 绝对路径
parent_dir="$(dirname "$project_dir")" # 获取上级目录

# 3️⃣ 检查是否是 Git 仓库
cd "$project_dir" || exit 1
if [ ! -d ".git" ]; then
echo "⚠️ 该目录未进行 Git 初始化,正在初始化..."
git init # 初始化 Git 仓库

# 4️⃣ 创建 .gitignore 文件,并确保忽略 .DS_Store
gitignore_file=".gitignore"
if [ ! -f "$gitignore_file" ]; then
echo "📄 创建 .gitignore 文件..."
echo "# 忽略 macOS 生成的系统文件" > "$gitignore_file"
echo ".DS_Store" >> "$gitignore_file"
echo "✅ .gitignore 文件已创建并添加 .DS_Store"
else
# 确保 .gitignore 已忽略 .DS_Store
if ! grep -q ".DS_Store" "$gitignore_file"; then
echo ".DS_Store" >> "$gitignore_file"
echo "✅ .gitignore 已更新,添加 .DS_Store"
fi
fi

echo "✅ Git 初始化完成!"
# echo "⚠️ 请手动添加文件并提交后再运行此脚本导出差异文件。"
# exit 0
fi

# 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 ]; then
echo "✅ 没有任何差异文件,操作完成!"
exit 0
fi

# 8️⃣ 让用户输入导出目录
read -p "请输入要导出的目标目录: " export_dir

# 9️⃣ 处理导出目录路径,使其与 Git 项目目录处于同一级
if [[ "$export_dir" != /* ]]; then
export_dir="$parent_dir/$export_dir" # 转换为绝对路径,并确保和项目同级
fi

mkdir -p "$export_dir" # 确保目标目录存在

# 🔟 复制所有差异文件(保持原目录结构)
echo "📂 正在导出差异文件到 $export_dir ..."
while IFS= read -r path; do
if [ -f "$path" ]; then
mkdir -p "$export_dir/$(dirname "$path")" # 创建目标目录
cp "$path" "$export_dir/$path" # 复制文件
elif [ -d "$path" ]; then
mkdir -p "$export_dir/$path" # 创建目录
cp -r "$path/." "$export_dir/$path" # 复制整个目录
fi
done < /tmp/filtered_files.txt

echo "✅ 差异文件已复制到: $export_dir"

# 1️⃣1️⃣ 询问用户是否提交更改
read -p "是否需要提交这些更改? (y/n): " commit_choice
if [ "$commit_choice" = "y" ]; then
git add . # 添加所有文件
read -p "请输入提交信息: " commit_msg
git commit -m "$commit_msg" # 提交更改
echo "✅ 提交完成!"
else
echo "🚀 退出,未提交更改。"
fi

exit 0

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部