拦截 "git commit -a(m)"

3
我喜欢Git索引允许的细粒度提交,即在最终提交之前通过"git add"暂存单个文件甚至是hunks。不幸的是,有时候经过一些时间暂存特定的提交后,肌肉记忆会让我输入"git commit -a -m "msg""。那么我要么接受它,要么跳过一些重置或--amend hoops。
有没有一种方法可以(理想情况下是全局)配置Git,使得如果我发出"git commit -a",它会被拦截?也许是一个脚本询问我是否真的要全部提交?我考虑过将提交操作委托给包装脚本(例如 "gitcommit"),但我不认为这样做很好,因为它不能阻止我执行"git commit -a -m "msg"",这正是问题所在。

1
@Jeet:不,插件是可以的,因为它们能够提供重要且有用的额外功能。但当一个工具给你一行命令来撤销某些操作时,添加提示并不值得。提示主要用于确认(1)不可逆的操作和(2)不可中断的长时间运行操作。此外,正如J-16所说,你会训练自己忽略这个提示,就像你训练自己提交一样。Git使备份变得非常容易,相比输入快速的重置/修正命令来说,花费时间给自己添加提示会更加浪费时间。 - undefined
@cdhowie:“重要,有用”...我同意!很多人在Vim中使用插入模式缩写来将“teh”更正为“the”。但是我不这样做,因为对我来说没有用处,我很少犯这个错误。另一方面,我经常犯commit -a的错误,所以从Git的角度来修复它对我来说是一个有用的改变。虽然重置可能只需要一行命令,但重新暂存一组精心计划的提交很多时候并不容易。这就是我提问的动机所在。我理解你看不到以这种方式重构Git的好处或重要性,这没问题。 - undefined
@cdhowie:谢谢你澄清这个问题。如果确实是这样的话,那么你绝对正确,Git对于我的情况有一个开箱即用的解决方案,使用这种方法比插入拦截更好。这也意味着你关于我需要学会更好地使用它的观点是正确的,我已经学了,并且非常感谢你对此的贡献! - undefined
@cdhowie: 我试过了 git reset --soft,但不幸的是,它会将通过 -a 标志添加的额外文件保留在索引中。示例脚本在这里:http://pastie.org/1335618。对于我这样的手残党来说,理想的修复方法是只将 "file1.txt" 和 "file2.txt" 添加到索引中。否则,采取预防措施(例如拦截过度热情的提交)可能是一个更好的选择(对我来说)。 - undefined
@Jeet:啊,我明白了 - 是的,由于-a会改变索引,如果你继续使用git reset --soft提交,恢复操作就不会起太大作用。在这种情况下,git commit -a可以被视为一种"不可逆的操作"(在某种程度上;至少在处理复杂提交时,可能不容易撤销)。所以是的,在这种情况下,我现在明白为什么有一个提示会是一件好事了。对不起,我刚才确实有点固执。 :) - undefined
显示剩余4条评论
2个回答

5

请尝试使用 pre-commit hooks

类似于以下内容(未经测试):

.git/hooks/pre-commit

#!/bin/sh
git diff-files --quiet    # check if the working directory have non-staged files
DIRTY_WORKING=$?

if [ ! $DIRTY_WORKING ] ; then        #  check if we are committing all files
   # list all files to be committed
   git diff-index --name-status --cached HEAD

   echo "Are you sure? (type YES to continue)"
   read VALUE
   [ "x$VALUE" != "xYES" ]
   exit $?
fi
exit 0

你可以使用 git diff-index --cached HEAD | wc -l 命令来查找需要提交的文件数量。但我认为这个任务应该由你自己完成。

这看起来很有希望。也许如果脚本能够检查索引,例如,看看是否暂存了多个文件,并且只在那种情况下提示,那么它可能会起作用。更好的是,如果有一种方法可以检查即将提交的文件集是否包含所有已修改的跟踪文件,那将是一种间接推断是否实际使用了“-a”的方式?当然,如果它将所有添加到索引中的文件都标记为“-a”,那就意味着即使我取消操作,我也必须重新构建索引... - undefined
我已经更新了答案。再次强调,这尚未经过测试,请自行决定是否使用,存在一定的风险。 - undefined
谢谢。这个原理上看起来应该是可行的。我会试一试! - undefined

1
一种方法是将git设置为别名,运行一个由您创建的脚本,该脚本查看命令行参数并让您知道是否在命令行上键入了commit后跟-a
个人而言,我从不使用commit -a,而是始终使用git add -u加上git commit

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