引言

不知道各位有没有试过一种情况

git提交记录
A功能第1次提交
A功能第2次提交
B功能第1次提交
B功能第2次提交
B功能第3次提交
A功能第3次提交

这里A功能做完了,但是B功能不能上

这里B功能和A功能没有交叉的文件

那就需要提取出来A功能所有涉及到的文件,并且去重了!

前提条件

  1. 需要在Linux系统或者Windows系统下的git-bash窗口执行此命令
  2. 提前安装好git软件和zip命令,安装方法如下

实现效果

注意!!!

这里生成的所有文件,都是基于本地工作区内的文件打包的

并不是某次提交时的文件状态

git提交指示的几个时间点只是汇总出来文件名而已,不是那时候的文件状态

放置在项目目录下

注意,这个目录必须是git项目的目录噢

执行结果

这个文件名可以自己修改

然后生成的目录会保存在git_commit_files目录下

生成效果

代码实现

#!/bin/bash

# 检查参数
if [ $# -lt 1 ]; then
    echo "用法: $0 <commit1> [<commit2> ...]"
    exit 1
fi

# 输出目录
output_dir="git_commit_files/$(date +%s)"
mkdir -p "$output_dir"

# 遍历所有提交
for commit in "$@"; do
    echo "处理提交: $commit"

    # 检查提交是否存在
    if ! git rev-parse --verify $commit &>/dev/null; then
        echo "错误: 提交 $commit 不存在!" >&2
        continue
    fi

    # 获取文件列表
    output_file="$output_dir/files_$commit.txt"

    # 判断是否为初始提交
    git diff-tree --no-commit-id --name-only -r $commit > "$output_file"

    echo "  文件列表已保存至: $output_file"
done

# 生成合并文件(去重)
cat "$output_dir"/files_*.txt | sort -u > "$output_dir/all_files_combined.txt"
echo "合并文件列表(去重): $output_dir/all_files_combined.txt"
cat "$output_dir"/all_files_combined.txt | xargs zip "$output_dir"/all_files.zip

echo "完成! 所有结果保存在: $output_dir"

欢迎关注拓行公众号,分享各种技术博客文章

拓行——奋勇进取,开拓未来,砥砺前行

最后修改:2025 年 06 月 30 日
如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~