如何禁用 git commit 命令的 -a 选项

5
我们是一组从事同一组文件开发的开发人员。我想确保没有人执行git commit -a -m或git commit -am。
包括我在内的开发人员有这种不好的习惯,即使用git commit -am / -a -m,我们有很多特定于机器的conf文件每次都会被提交。我可以要求我们所有人使用--assume-unchanged,但我希望开发人员根本无法使用-a标志。
我能否通过某种方式进行黑客攻击以实现此目的?

4
我无法回答这个问题,但如果意图特别是为了防止提交配置文件,那么创建一个.gitignore文件可能会有所帮助。 - chipschipschips
3个回答

5
我建议您以不同的方式解决此问题:
  1. 使用.gitignore文件明确排除不应提交的文件或
  2. 使用pre-commit hook自动拒绝看起来像使用-a选项提交的代码。
如果您坚持禁用-a标志:好吧,Git是开源的。找到并禁用读取-a命令行参数的代码并重新编译不应该很难。但这意味着每当发布Git的新版本时,您都必须再次执行此操作,因此我真的不建议这样做。

尽管我反对重写 Git,但我会尝试学习编写 precommit 钩子。有什么好的资源吗? - Ranjith Ramachandra
@RanjithR 你可以从任何 git 存储库中查看 .git/hooks/*.sample 文件开始。但我不知道 -a 是否在调用该钩子之前将所有修改的文件都暂存了。 - Tobias Kienzler
2
我认为使用 .gitignore 文件会是更好的解决方案。这样仍然可以通过使用 -a 来节省时间,但可以防止提交任何机器特定的文件。 - Philipp
问题是.gitignore会完全忽略该文件。有时我们会向conf文件中添加内容并需要提交它们。然后通知所有人备份,并小心地合并它们。 - Ranjith Ramachandra
@RanjithR,你的接受是否意味着你制作了一个预提交钩子?如果是,请将其编辑到答案中供其他人查看。 - Tobias Kienzler
我最初决定使用预提交钩子,因此我接受了这个答案。但是在一次强有力的管理会议后问题得到解决,现在每个人都使用 git commit -m 的别名 gcm。 - Ranjith Ramachandra

3
您可以编写一个包装器git脚本,检查命令是否是commit并设置了-a标志。然后,您可以将其删除并将其他所有内容传递给实际的git,或者提示“Bad User!Bad!”将该脚本放在实际git路径之前的路径中,或者为您的gitwrap创建别名。
@PiotrZierhoffer发现了这个例子:

这方面的一个例子在这里: Disable -m in git


这是一个很好的解决方案。我添加了一个独立的答案作为实施方案。 - undefined

1
这个习惯还会导致子模块和预提交代码格式化方面的烦人问题。一个禁止使用-a的配置选项将是完美的。其次,可以实现@TobiasKienzler提出的建议。
git() {
    # specifically disallow "git commit -a", nothing more
    if [[ $1 == 'commit' && $2 == '-a' ]]
    then
        echo "Bad User! Bad!"
        return
    fi
    command git "$@"
}

易于规避,但这是一个特点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接