有时我们团队中的某个人执行 git push 并破坏了构建,因为他的本地构建工作但他忘记在推送之前将所有本地修改和未跟踪的文件提交到 git。
我想防止这种情况发生......我今天在文档上倾注了一个小时左右,但找不到任何内置的东西。
有没有人有任何解决方案?
您可以使用pre-push
钩子(从 git 1.8.2 开始)。
您的 pre-push 钩子可以检查 的退出代码git status
,如果git status
返回非零则返回 0(可以推送),否则返回 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 或配置脚本,开发人员无需查看即可运行。)
您可以使用各种钩子(我相信是预接收)来确定推送是否会破坏构建并拒绝它。除此之外,您应该告诉您的开发人员git status
在任何提交或推送操作之前运行,这是一个非常明智的规则,可以阻止此类问题。
要自动添加更改,您可能需要考虑使用该-a
标志。从git-commit
手册页:
告诉命令自动暂存已修改和删除的文件,但您没有告诉 git 的新文件不受影响。
似乎没有任何标志可以git commit
添加未跟踪的文件。记住在提交之前做一个git add .
是我能想到的最好的解决方案。
也许在你的 shell 或 git config 中放置一个别名,用一个自定义脚本替换默认的 push 命令,该脚本首先执行 git status 并检查“工作目录清洁”?我不知道是否可以覆盖推送,或者是否会这样做,这样您就无法调用真正的推送。只是我头脑中的一个想法,所以我不知道它是否真的有效。
在推送到我们的主仓库之前,我最终在我们的本地构建中添加了一个 ant 目标……这是目标……以防其他人正在寻找朝着正确方向迈出的一步。
感谢所有回答的人。
<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>