如果检测到本地修改(包括未跟踪文件),如何防止git push?

时间:2010-05-14 00:41:22

标签: git push git-push

有时我们团队中的某个人会做一个git push并打破构建,因为他的本地构建工作但他忘记在他推动之前将所有本地修改和未跟踪文件提交给git。

我想阻止这种情况......今天我把文档倒了一个小时左右,找不到内置的东西。

有没有人有任何解决方案?

5 个答案:

答案 0 :(得分:6)

您可以使用pre-push挂钩(自git 1.8.2起)。

你的预推钩可以检查git status的退出代码,如果git status返回非零则返回0(OK推送),否则返回1(不允许推送)。

git-status的手册页说:

如果索引文件和当前HEAD提交之间没有不同的路径(即,通过运行git commit没有提交任何内容),则命令以非零状态退出。

使用git 1.8.2或更高版本创建的任何repo在pre-push.sample目录中都有.git/hooks,这是实施策略的有用起点。这里有更多使用pre-push钩子的好例子:http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/

请注意,钩子不会在上游仓库上运行。每个克隆都需要安装此挂钩,以强制执行您的策略。 (钩子不是作为存储库的一部分克隆的。由于钩子是由git执行的,这种设计可以防止在开发人员的机器上运行恶意钩子。恶意代码应该转到Makefile或配置脚本,开发人员无需查看即可运行。)

答案 1 :(得分:1)

您可以使用various hooks(预先接收,我相信)来确定推送是否会破坏构建并拒绝它。除此之外,您应该告诉开发人员在任何提交或推送操作之前运行git status,这是一个非常合理的规则,可以阻止这些问题。

答案 2 :(得分:0)

要自动添加更改,您可能需要查看使用-a标志。来自git-commit man page

  

自动告诉命令   已修改的阶段文件   并删除,但你有新的文件   不告诉git不受影响。

git commit似乎没有添加未跟踪文件的标志。记住在提交之前做git add .是我能想到的最佳解决方案。

答案 3 :(得分:0)

也许在shell或git config中添加一个别名,用一个首先执行git status并检查“working directory clean”的自定义脚本替换默认的push命令?我不知道是否可以覆盖推送,或者它是否会使你无法调用真正的推送。只是一个想法,所以我不知道它是否真的有用。

答案 4 :(得分:0)

我最终在我们的主要回购中添加了一个蚂蚁目标到我们的本地构建...这里是目标...以防其他人正在寻找正确方向的一步。

感谢所有回答的人。

<target name="git-status-check">
    <echo>Performing git working directory check for local modifications or untracked files.</echo>
    <exec executable="git" failifexecutionfails="true"
        outputproperty="git.check">
        <arg value="status"/>
    </exec>
    <echo>${git.check}</echo>
    <propertyregex property="dirty.working.dir" input="${git.check}" regexp="working directory clean" 
        select="\1" casesensitive="false" />
    <fail message="Git status reports that you have local modifications or untracked changes in your working dir... did you forget to commit these changes? ${line.separator} ">
        <condition>
            <not>
                <isset property="dirty.working.dir" />
            </not>
        </condition>
    </fail>
    <echo>Git status reported a clean working dir continuing build...</echo>
</target>