如果我在手动添加文件之前已经提交了所有文件,我可以让git拒绝所有提交吗?

如果我在手动添加文件之前已经提交了所有文件,我可以让git拒绝所有提交吗?,git,version-control,git-commit,git-add,Git,Version Control,Git Commit,Git Add,大多数情况下,我使用git commit-am进行提交,因为我对项目所做的一切都属于我正在进行的提交 只是有时候,有些更改我不想提交,所以我只使用git add-p来展示我真正想要的。问题是,我太习惯于键入git commit-am,以至于我通常都会这样做。然后,我得到了一个我不想要的东西的提交,不得不费力地返回到HEAD^,并重新执行add-p 显然,当已经手动添加了一些更改时,commit-am就不再有意义了。在这种情况下,有没有办法阻止git接受这个选项(或者是同样方便的-am的替代方案)

大多数情况下,我使用git commit-am进行提交,因为我对项目所做的一切都属于我正在进行的提交

只是有时候,有些更改我不想提交,所以我只使用
git add-p
来展示我真正想要的。问题是,我太习惯于键入
git commit-am
,以至于我通常都会这样做。然后,我得到了一个我不想要的东西的提交,不得不费力地返回到
HEAD^
,并重新执行
add-p

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

更简单、更快、更诱人。就像git commit-am一样诱人,你应该训练自己远离它。它实际上是用于非常简单的(例如,单个文件)提交。充分利用暂存区域:在拍摄快照之前,请花点时间进行备份

如果这个警告还不够,您需要一些帮助来避免git提交-am。。。不幸的是,gitapi本身并没有提供一种简单的方法来“禁止”其命令的子集。一种不是很健壮的方法,但最有效的方法是为
git
编写一个简单的shell包装函数,注意命令行参数
commit
-am
,并在使用这些参数时采取措施(策略与中相同):

#Git包装器禁止“Git提交-am”
git(){
如果[“$1”=“提交”-a“$2”=“-am”];则
printf“'git commit-am'当前被git包装器禁用。\n”;
其他的
命令git“$@”;
fi;
}

根据您的习惯,您当然可以改进此包装以使其更加健壮。

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

#!/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
相反(注意前导空格)


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

另一种方法是添加一个请求确认的预提交钩子,但我认为没有办法告诉该钩子使用了
-am
标志。我担心如果不是
-am
,我的手会习惯于键入
git add.&&git commit-m
,我会再次遇到同样的问题。@leftaroundautabout“坏习惯”难以改变。除非您准备好编辑Git源代码并为自己构建一个自定义版本,否则我想不出任何其他方法,除了我在回答中概述的方法。。。它成功了。谢谢必须记住使用
git cm
而不是
git
。。。当一个人已经试图记住不要使用某个命令时,这有什么帮助?无论如何,您可能希望将
--cerial
标志添加到
git status
命令中,以提高健壮性。