如果我之前有手动添加的文件,我可以让 git 拒绝全部提交吗?

Can I make git reject an all-commit if I have before manually added files?

大多数时候,我提交 git commit -am,因为我对项目所做的一切都属于我正在处理的提交。

只是有时候,有些更改我不想提交,所以我使用 git add -p 只展示我真正想要的。麻烦的是,我已经习惯了输入 git commit -am 以至于我通常最终还是会这样做。然后我提交了我不想要的东西,不得不费力地回到 HEAD^,并重新做 add -p

显然,如果已经手动添加了一些更改,commit -am 就不再有意义了。在这种情况下,有没有办法阻止 git 接受该选项(或者 -am 的某种替代方法同样方便)?

更简单、更快捷、更诱人。 尽管 git commit -am 可能很诱人,但您应该训练自己远离它。它真的意味着非常简单的(例如单文件)提交。充分利用暂存区:在拍摄快照之前花时间 compose the shot

如果这个警告还不够,您需要一点帮助来避免 git commit -am...嗯,不幸的是,Git API 本身并没有提供"forbidding" 其命令子集的简单方法。一种不是很健壮但主要有用的方法是为 git 编写一个简单的 shell 包装函数,它会留意命令行参数 commit-am,并在使用这些参数时采取措施(与 this other answer 中的策略相同):

# Git wrapper forbidding 'git commit -am'
git() {
    if [ "" = "commit" -a "" = "-am" ]; then
        printf "'git commit -am' is currently disabled by your Git wrapper.\n";
    else
        command git "$@";
    fi;
}

根据您的习惯,您当然可以优化此包装器以使其更健壮。

您可以创建一个脚本文件,git-cm,并将其放入您的 PATH

#!/bin/sh

DIRTY=$(git status -s| grep -e "^[A-Z]")
if [ ! "$DIRTY" ]; then
    git commit "$@";
    exit 0;
else 
    echo "Rejected, files already manually added";
    exit 1;
fi

运行这个当你想提交

git-cm -am "some message"

如果您已经手动添加了文件,脚本将拒绝提交并中止操作。

这是因为在这种情况下,git status -s 会生成以例如

开头的行
M  file/Ive/just.added`

没有手动添加的地方

 M file/Ive/just.added

相反(注意前导 space)。

您可能需要根据您的环境进行调整。