我经常使用 提交git commit -a
。不过,我有时使用 暂存单个文件,git add
而不使用 提交-a
。当我不小心时,我可能会不小心输入,-a
而我之前已经为我的下一次提交准备了一个精心制作的暂存区域,如果我真的想将不同的更改保存在单独的提交中,我将不得不重新制作它。
有没有办法防止这种情况发生?理想情况下,如果(且仅当)某些更改已经暂存,git 应该询问(或断然拒绝)切换-a
。我认为应该有一个配置,但我找不到它……
答案1
这里是 Unix 方法。
您不需要git
支持即可获得简单警告。您可以编写包装器脚本或 shell 函数来检查命令行参数并采取相应的措施。
bash
此功能应在(将其添加到您的.bashrc
可能)或甚至在纯中起作用sh
。
git() {
local found
found=0
for option; do
if [ "$option" = "-a" ]; then found=1; break; fi
done
if [ "$found" -eq 1 ]
then
read -p "Option \`-a' detected. Please confirm with capital Y:" -r key
[ "$key" != "Y" ] && return 254
fi
command git "$@"
}
或者使用脚本来代替函数:
#!/bin/sh
found=0
for option; do
if [ "$option" = "-a" ]; then found=1; break; fi
done
if [ "$found" -eq 1 ]
then
read -p "Option \`-a' detected. Please confirm with capital Y:" -r key
[ "$key" != "Y" ] && return 254
fi
exec "/full/path/to/git" "$@"
将脚本命名为git
,使其可执行,并将其放在您的目录中,该$PATH
目录位于具有实际git
.的目录之前,$HOME/bin
可能是正确的位置;我的 Debian 甚至提供.profile
(通过/etc/skel/.profile
)来自动将此路径添加到(如果目录存在)。请记住,从现在开始,任何依赖于调用的PATH
工具(例如脚本)都将调用您的包装器脚本。您可能不想要这样。如果是这样,请使用 shell 函数方法。$PATH
git
整个过程是一个概念验证,它可能不是最优的。它还不关心你的“如果(且仅当)一些更改已经上演”条件。我不熟悉git
但我相信这个答案提供了一种检查方法:
git diff --cached
使用它来扩展函数或脚本的逻辑。请记住,您需要/full/path/to/git
避免脚本调用自身并陷入循环(如没有分叉的分叉炸弹、连锁炸弹)。出于同样的原因,该函数应该使用/full/path/to/git
或。command git
你也可以[ "$option" = "-a" ]
用类似的东西来替换
[[ "$option" =~ ^-[a-zA-Z0-9]*a[a-zA-Z0-9]* ]]
覆盖a
以紧凑形式给出的其他开关的情况(例如-Pa
)。[[
命令不可移植尽管。