求阻止旧提交错误恢复的Git Hook示例及相关疑问解答
关于Git旧提交与PR、Hook检查范围的问题解答
疑问解答
1. 旧提交在PR中是否可见?
如果旧提交被包含在PR分支的历史里,就会在PR的提交列表中显示——PR本质是对比两个分支的差异,只要目标分支没有这个旧提交,而你的PR分支带有它,就会被展示出来。
2. Git Hook仅检查PR中的新提交,还是会检查所有历史提交?
Git Hook的检查范围完全由你编写的脚本逻辑决定。默认没有内置检查规则,你可以让它只校验本次推送的新提交,也可以遍历分支上的所有历史提交进行核查。
阻止旧提交重新进入历史的pre-push Hook示例
要拦截特定旧提交被推送到远程仓库,可编写pre-push脚本实现,步骤如下:
- 在本地仓库的
.git/hooks目录下创建pre-push文件(无后缀),写入以下内容:
#!/bin/bash # 替换为你要阻止的目标提交哈希 UNWANTED_COMMIT="abc123def456" # 获取本地分支相对于远程分支的所有待推送提交哈希 LOCAL_COMMITS=$(git log --pretty=format:"%H" $REMOTE_NAME/$REMOTE_BRANCH..$LOCAL_BRANCH) # 检查待推送提交中是否包含禁止的旧提交 if echo "$LOCAL_COMMITS" | grep -q "$UNWANTED_COMMIT"; then echo "错误:推送包含了禁止的旧提交 $UNWANTED_COMMIT" exit 1 # 终止推送操作 fi exit 0 # 验证通过,允许推送
- 给脚本添加执行权限:
chmod +x .git/hooks/pre-push
这个脚本会对比本地分支与远程分支的差异,找出所有待推送的提交(包括被重新引入的旧提交),一旦检测到指定的禁止提交,就会阻止推送。你还可以扩展逻辑,比如从文件读取多个禁止提交ID,或者校验提交作者、信息等特征。
内容的提问来源于stack exchange,提问作者tasosioan7
相关产品推荐
相关产品推荐

