自己工作用的 git相关自动脚本
用来还原指定提交中的所有修改文件的脚本
脚本功能介绍
这个脚本是用来还原指定提交中的所有修改文件的。它接受一个参数,就是要还原的提交的哈希值。它会获取指定提交中修改的文件列表,并将这些文件还原到工作目录中,即将这些文件恢复到指定提交的父提交的状态。然后,它会将这些更改添加到暂存区并提交,以完成还原操作。
#!/bin/bash # 检查参数数量 if [ "$#" -ne 1 ]; then echo "Usage: $0 <commit-hash>" exit 1 fi commit_hash="$1" # 获取指定提交中修改的文件列表 files=$(git show --name-only --pretty=format: "$commit_hash") # 将指定提交中的所有修改文件还原到工作目录 for file in $files; do echo "Reverting changes for: $file" git checkout "$commit_hash^" -- "$file" done # 将更改添加到暂存区并提交 #git add . #git commit -m "Revert changes from commit $commit_hash"
使用示例
要运行这个脚本,需要在终端中输入:
bash revert.sh <commit-hash>
例如:
bash revert.sh 3a4b5c6 # 将3a4b5c6提交中的所有修改文件还原
然后就可以看到类似下面的输出:
Reverting changes for: file1.txt Reverting changes for: file2.txt Reverting changes for: file3.txt [master 7d8e9f0] Revert changes from commit 3a4b5c6 3 files changed, 12 insertions(+), 9 deletions(-)
用来导出指定分支和提交范围内的所有修改文件的脚本
脚本功能介绍
这个脚本是用来导出指定分支和提交范围内的所有修改文件的。它接受两个参数,分别是要导出的分支名和提交哈希值。它会获取指定分支和提交范围内修改的文件列表,并将这些文件复制到一个新建的目录中,目录的名字由分支名和提交哈希值组成。如果文件在指定的提交中被删除了,就跳过该文件。
#!/bin/bash if [ $# -ne 2 ]; then echo "Usage: $0 <branch> <commit_hash>" exit 1 fi branch="$1" commit_hash="$2" export_dir="exported_files_${branch}_${commit_hash}" files_to_export=$(git diff-tree --no-commit-id --name-only -r ${branch}~${commit_hash}) mkdir -p "$export_dir" for file in $files_to_export; do file_dir=$(dirname "${export_dir}/${file}") mkdir -p "$file_dir" git show ${branch}:${commit_hash}^ -- "$file" > "${export_dir}/${file}" 2> /dev/null || echo "Skipped deleted file: $file" done echo "Files exported to $export_dir"
使用示例
要运行这个脚本,需要在终端中输入:
bash export.sh <branch> <commit_hash>
例如:
bash export.sh master 3a4b5c6 # 将master分支上3a4b5c6之前的所有修改文件导出
然后就可以看到类似下面的输出:
Skipped deleted file: file1.txt Files exported to exported_files_master_3a4b5c6
用来生成所有分支上的所有唯一提交的补丁文件的脚本
脚本功能介绍
这个脚本是用来生成所有分支上的所有唯一提交的补丁文件的。它不接受任何参数。它会遍历所有的分支,并获取每个分支上的提交列表,然后对每个提交进行处理。如果一个提交已经被处理过,就跳过它;如果一个提交的消息中包含"init",就跳过它;如果一个提交是孤立的,就跳过它;如果一个提交修改了超过100个文件,就跳过它;如果一个提交的二进制差异超过10MB,就跳过它。对于其他的提交,它会生成一个补丁文件,并保存到patches目录下,以分支名和提交消息为子目录和文件名。
使用示例
要运行这个脚本,只需要在终端中输入:
bash generate_patches.sh
然后就可以看到类似下面的输出:
Skipped patch with 'init' in commit message: init project Skipped patch with more than 100 files changed: patches/master/add_some_features.patch Skipped patch larger than 10MB: patches/dev/fix_some_bugs.patch Skipped orphan commit: test orphan commit
在patches目录下,可以看到类似下面的结构:
patches/ ├── master │ ├── add_some_features.patch │ └── update_readme.patch └── dev ├── fix_some_bugs.patch └── refactor_code.patch