2010-05-14 64 views
5

有时候我们团队中的某个人做了git push,并破坏了构建,因为他的本地构建工作正常,但他忘记了在他推送之前将所有本地修改和未跟踪文件都提交给git。如果检测到本地修改(包括未跟踪文件),我该如何防止git push?

我想阻止这个...我今天倒在文档了一个小时左右,找不到任何内置的。

没有人有什么办法呢?

+5

告诉你的开发者要更小心吗?工具并不总是解决方案。 – 2010-05-14 00:46:45

+2

给git回购一些颜色,并教你的开发者关于“git add”。 “git status”和“git add -A” – 2010-05-14 01:02:44

回答

5

你可以使用pre-push钩子(自git 1.8.2开始)。

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

git-status手册页说:

如果没有路径是索引文件和当前HEAD提交之间的差异(即,没有什么运行git承诺提交),该命令将退出具有非零状态。

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

请注意钩子不能在上游回购库上运行。每个克隆都需要安装该钩子,以执行您的策略。 (钩子不会作为仓库的一部分被克隆,因为钩子是由git执行的,所以这种设计可以防止开发人员的机器上运行恶意钩子,恶意代码应该进入Makefile或配置脚本,开发人员无需查看就可以运行该脚本。)

+0

这不是“预推”钩子吗? – Glyph 2014-06-23 03:50:34

+0

@Glyph - 谢谢! git 1.8.2中增加了'pre-push',所以我的回答已经过时了。对于任何感兴趣的人,这里有一些很好的信息:http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/ – 2014-07-24 15:24:54

0

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

0

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

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

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

+0

请记住,“git add”。只会添加与命令运行在同一级别之下或之上的文件 – 2010-05-14 00:59:36

0

也许把一个别名,无论是在你的外壳或git配置,取代默认的推命令与自定义脚本,首先做git status并检查“工作目录干净”?我不知道覆盖推送是否可能,或者如果它会使你不能接受真正的推送。只是一个想法,我的头脑,所以我不知道它是否真的有用。

+0

你不能使用别名来覆盖内置的命令。 shell别名不能包含空格,所以你几乎可以回写自己的命令。 – Cascabel 2010-05-14 03:24:17

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> 
+0

我的回答是否帮助你/回答你的问题? – 2010-05-17 07:33:39

+0

你应该接受马特的回答...这不是特别有用,考虑到这个问题(来自谷歌和马特的评论是非常有帮助的) – 2016-04-12 20:37:12

+0

我做了... 6年前 – Clintm 2016-04-13 14:16:19

相关问题