有时候我们团队中的某个人做了git push,并破坏了构建,因为他的本地构建工作正常,但他忘记了在他推送之前将所有本地修改和未跟踪文件都提交给git。如果检测到本地修改(包括未跟踪文件),我该如何防止git push?
我想阻止这个...我今天倒在文档了一个小时左右,找不到任何内置的。
没有人有什么办法呢?
有时候我们团队中的某个人做了git push,并破坏了构建,因为他的本地构建工作正常,但他忘记了在他推送之前将所有本地修改和未跟踪文件都提交给git。如果检测到本地修改(包括未跟踪文件),我该如何防止git push?
我想阻止这个...我今天倒在文档了一个小时左右,找不到任何内置的。
没有人有什么办法呢?
你可以使用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或配置脚本,开发人员无需查看就可以运行该脚本。)
这不是“预推”钩子吗? – Glyph 2014-06-23 03:50:34
@Glyph - 谢谢! git 1.8.2中增加了'pre-push',所以我的回答已经过时了。对于任何感兴趣的人,这里有一些很好的信息:http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/ – 2014-07-24 15:24:54
您可以使用various hooks(我相信预先接收)来确定推送是否会破坏构建并拒绝构建。除此之外,您应该告诉您的开发人员在任何提交或推送操作之前运行git status
,这是一个非常明智的规则,可以阻止此类问题。
要自动添加更改,您可能需要使用-a
标志进行调查。从git-commit
man page:
告诉给你 没有告知已被修改 并自动删除 阶段文件,但新文件有关不受影响的git命令。
似乎没有任何标志git commit
添加未跟踪文件。在提交之前记住做一个git add .
是我能想到的最佳解决方案。
请记住,“git add”。只会添加与命令运行在同一级别之下或之上的文件 – 2010-05-14 00:59:36
也许把一个别名,无论是在你的外壳或git配置,取代默认的推命令与自定义脚本,首先做git status并检查“工作目录干净”?我不知道覆盖推送是否可能,或者如果它会使你不能接受真正的推送。只是一个想法,我的头脑,所以我不知道它是否真的有用。
你不能使用别名来覆盖内置的命令。 shell别名不能包含空格,所以你几乎可以回写自己的命令。 – Cascabel 2010-05-14 03:24:17
在推送到我们的主要回购之前,我最终添加了一个蚂蚁目标到我们的本地版本...这里是目标...以防其他人在正确的方向上寻找一步。
感谢所有回答。
<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>
我的回答是否帮助你/回答你的问题? – 2010-05-17 07:33:39
你应该接受马特的回答...这不是特别有用,考虑到这个问题(来自谷歌和马特的评论是非常有帮助的) – 2016-04-12 20:37:12
我做了... 6年前 – Clintm 2016-04-13 14:16:19
告诉你的开发者要更小心吗?工具并不总是解决方案。 – 2010-05-14 00:46:45
给git回购一些颜色,并教你的开发者关于“git add”。 “git status”和“git add -A” – 2010-05-14 01:02:44