【问题标题】:Can I make git reject an all-commit if I have before manually added files?如果我之前手动添加文件,我可以让 git 拒绝所有提交吗?
【发布时间】:2015-11-25 13:38:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: git version-control git-commit git-add


    【解决方案1】:

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

    如果这个警告还不够,并且您需要一些帮助来避免git commit -am... 那么,不幸的是,Git API 本身并没有提供“禁止”其命令子集的简单方法。一种不是很健壮的方法,但这主要是解决问题的方法,是为git 编写一个简单的shell 包装函数,它密切关注命令行参数commit-am,并在这些参数出现时采取措施使用(与this other answer中相同的策略。):

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

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

    【讨论】:

    • 另一种方法是添加一个要求确认的预提交挂钩,但我认为没有办法告诉该挂钩使用了 -am 标志。
    • 如果不是-am,恐怕我的手会习惯于输入git add . && git commit -m,我又会遇到同样的问题。
    • @leftaroundabout “坏习惯”很难改掉。除非您准备好编辑 Git 源代码并为自己构建一个自定义版本,否则除了我的答案中概述的之外,我想不出任何其他方式。
    【解决方案2】:

    您可以创建一个脚本文件 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 会生成以 e.g. 开头的行

    M  file/Ive/just.added`
    

    不用手动添加的地方

     M file/Ive/just.added
    

    改为(注意前导空格)。

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

    【讨论】:

    • egrep '^[A-Z]' 似乎是一个糟糕的 hack,但是哦,好吧......它成功了。谢谢!
    • 一个人必须记住使用git-cm 而不是git... 当一个人已经在努力记住不要使用某个命令时,这有什么帮助?无论如何,您可能希望将--porcelain 标志添加到您的git status 命令中,以提高稳健性。
    猜你喜欢
    • 2017-10-20
    • 2021-12-04
    • 1970-01-01
    • 2019-05-19
    • 2021-09-18
    • 2011-02-21
    • 2013-11-23
    • 2015-03-15
    • 2023-03-04
    相关资源
    最近更新 更多