需求:
有两个分支 master 和 dev,dev 保留代码注释,master 去掉代码注释。
把 dev 合并到 master 之后,在 master 分支提交代码之前,先清理注释。
把 master 合并到 dev 的时候,需保证 dev 中的注释内容不受干扰。
要求Git提交日志中不显示因为清理注释而发生改变的文件。
实现方案:
dev 分支合并到 master 分支的时候,使用
git merge --squash dev命令。--squash选项可以将 dev 分支的所有提交造成的改变一次性打包并入master分支,避免在 master 分支上显示 dev 分支的提交记录。Git 并没有“pre-add”钩子(也就是在执行 git add 之前的钩子),但是可以用 pre-commit 钩子来在“提交之前”清理注释。
在.git/hooks/pre-commit中写入以下内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#
# pre-commit 钩子:
# 当在 master 分支提交时,自动清除本次提交中修改过文件的注释。
# 如果清理前后文件内容无变化,则不重新 git add。
#
branch=$(git rev-parse --abbrev-ref HEAD)
# 只在 master 分支启用
if [ "$branch" != "master" ]; then
exit 0
fi
echo "🔧 [pre-commit] Cleaning comments in modified files (branch: $branch)"
# 获取当前暂存区的修改文件列表(新增/修改)
files=$(git diff --cached --name-only --diff-filter=ACM)
for file in $files; do
# 仅处理指定类型文件
if [[ $file =~ \.(php|js|vue|java|kt|go|html)$ ]]; then
if [ -f "$file" ]; then
echo " - Checking $file"
# 创建临时文件
tmpfile=$(mktemp)
# 删除前导空格 + // + 反引号包裹的注释(贪婪匹配,不跨行),例:// `这是注释` or // `这是注释`这是注释`
sed -E 's#\s*//\s*`.*`##g' "$file" > "$tmpfile"
# 比较清理前后是否有变化,有变化则重新 git add,无变化则继续下一个文件
if ! cmp -s "$file" "$tmpfile"; then
echo " → Cleaned: comments removed"
mv "$tmpfile" "$file"
git add "$file"
else
echo " → Skipped: no change detected"
rm "$tmpfile"
fi
fi
fi
done