中央仓库代表了正式项目,所以提交历史应该被尊重且是稳定不变的。如果开发者本地的提交历史和中央仓库有分歧,Git 会拒绝 push 提交否则会覆盖已经在中央库的正式提交。 在开发者提交自己功能修改到中央库前,需要先 fetch 在中央库的新增提交,rebase 自己提交到中央库提交历史之上。 这样做的意思是在说,『 我要把自己的修改加到别人已经完成的修改上。
像 Subversion 一样,集中式工作流以中央仓库作为项目所有修改的单点实体。相比 SVN 缺省的开发分支 trunk ,Git 叫做master,所有修改提交到这个分支上。本工作流只用到 master 这一个分支。开发者开始先克隆中央仓库。在自己的项目拷贝中像 SVN 一样的编辑文件和提交修改;但修改是存在本地的,和中央仓库是完全隔离的。开发者可以把和上游的同步延后到一个方便时间点。
如果你的开发团队成员已经很熟悉 Subversion ,集中式工作流让你无需去适应一个全新流程就可以体验 Git 带来的收益。这个工作流也可以作为向更 Git 风格工作流迁移的友好过渡。 转到分布式版本控制系统看起来像个令人生畏的任务,但不改变已用的工作流你也可以用上 Git 带来的收益。团队可以用和 Subversion 完全不变的方式来开发项目。
工作流有各式各样的用法,但也正因此使得在实际工作中如何上手使用变得很头大。这篇指南通过总览公司团队中最常用的几种 Git 工作流让大家可以上手使用。在阅读的过程中请记住,本文中的几种工作流是作为方案指导而不是条例规定。在展示了各种工作流可能的用法后,你可以从不同的工作流中挑选或揉合出一个满足你自己需求的工作流。
工作流其实不是一个初级主题,背后的本质问题其实是有效的项目流程管理和高效的开发协同约定,不仅是 Git 或 SVN 等 VCS 或 SCM 工具的使用。这篇指南以大家在 SVN 中已经广为熟悉使用的集中式工作流作为起点,循序渐进地演进到其它高效的分布式工作流,还介绍了如何配合使用便利的 Pull Request 功能,体系地讲解了各种工作流的应用。
工作流其实不是一个初级主题,背后的本质问题其实是有效的项目流程管理和高效的开发协同约定。 这篇指南以大家在 SVN 中已经广为熟悉使用的集中式工作流作为起点,循序渐进地演进到其它高效的 Git 分布式工作流,还介绍了如何配合使用便利的 Pull Request 功能,体系地讲解了各种工作流的应用。
grunt-initgrunt-init是一个用于自动创建项目的脚手架工具。它会基于当前工作环境和几个问题的答案,构建一个完整的目录结构。但是这依赖于模板的选择,它会根据所提问题的答案,来创建更精确的文件和内容。注意:这个独立的程序曾经是作为Grunt内置的init任务而存在的。在从0.3升级到0.4指南中可以查看更多关于它演变的信息。
如何安装Grunt?对于一般安装说明,请阅读新手入门指南。如果你在阅完读新手入门指南之后想要了解更多具体的信息,请阅读详细的安装Grunt指南。我什么时候能够使用开发中的某个特性?依据安装Grunt指南中的说明可以了解如何安装发布的和未发布的开发版本的Grunt(对于插件,你也可以使用npm安装并添加到依赖中使用;对于新的特性可以查阅相关说明安装使用)。
本文档说明了如何安装指定版本的Grunt和Grunt插件。概览Grunt和Grunt插件应该作为项目依赖定义在你项目的 package.json 中。这样就允许你使用一个单独的命令:npm install安装你项目中的所有依赖(在package.json中定义好的grunt和grunt插件在使用npm install时会自动安装相关依赖,正如我们已经了解到的,这些依赖都定义在package.json中了)。
0 - 无错误1 - 致命错误2 - Gruntfile缺失错误3 - 任务错误4 - 模版处理错误5 - 无效的shell自动完成规则错误6 - 警告
inside 有『内幕,内情,内部秘密之意,因而本节译作内幕』。当一个任务运行时,Grunt通过this对象暴露出很多在任务函数内部的任务特有的实用属性和方法。这个对象也可以暴露为grunt.task.current在templates中使用。例如,this.name属性也可以写为grunt.task.current.name。所有任务内部都可以使用的方法/属性this.
各种实用工具,包括Lo-Dash,Async和Hooker等。grunt.util.kindOf返回给定值的"类型"。就像typeof运算符就会返回内部的[Class](Class/)信息。这个方法可能会返回"number","string","boolean","function","regexp","array","date","error","null","undefined"和代表一切类型的"object"。grunt.util.kindOf(value)grunt.util.
可以使用Grunt提供的模板相关函数来手动的处理模板字符串。此外,config.get方法(许多任务都有用到这个方法)可以自动解析指定在Gruntfile中作为配置数据的<% %>风格的模板字符串。grunt.template.process处理Lo-Dash模板字符串。template参数会以递归的方式进行处理,直到不再有需要处理的模板。默认情况下数据对象就是项目完整的配置对象,但是如果设置了options.
注册,运行以及加载外部任务。查看task lib source和task util lib source可以了解更多详细信息。The task API当一个任务运行时,Grunt通过任务函数内部的this对象将任务内部的大部分任务特定的实用属性和方法暴露在任务外面。可以在内置任务指南中查看它们属性和方法列表。许多实用的属性和方法通过任务内部this对象来访问都是有效的。
Grunt的option API可以用来跨多任务共享参数,以及在命令行中访问参数设置。一个简单的例子就是给你的目标(任务目标)打一个标记,标识任务是在开发阶段还是暂存阶段。在命令行中运行grunt deploy --target=staging就会让grunt.option('target')返回"staging"。下面是一个在Gruntfile中使用target选项的例子:grunt.
输出信息到控制器。查看log库源文件可以了解更多详细信息。The log APIGrunt输出看起来应该是一致的,甚至是漂亮的。因此,这里有大量的日志记录相关的方法和一些很有用的模式。所有的这些方法实际上记录的东西的都是可连接的。注意:所有grunt.verbose下可用的方法都酷似grunt.log方法,不同的是,如果指定--verbose命令行选项,那么它就只会记录日志信息。grunt.log.
这里提供了很多用来读取或者编辑文件,通过匹配模式遍历文件系统或者查找文件的方法。其中很多方法都是对Node.js中文件操作功能的一次包装,但是在这里标准化了额外的错误处理,日志记录和字符编码相关的行为。注意:通常情况下所有的文件路径都是相对于Gruntfile所在目录来确定,除非当前工作目录使用grunt.file.setBase或者命令行选项--base改变过。字符编码grunt.file.
用户发生致命错误时执行某些行为。查看fail lib source可以了解更多详细信息。The fail API如果任务内部已经崩溃(或者即将崩溃),这个API可以用于强制终止Grunt运行。在出口代码中可以查看内置的完整的Grunt出口代码列表。注意任何使用☃(unicode雪人)标记的方法都可以在grunt对象上直接调用。这里你只需要知道就行了,可以查看API主页可以了解更多用法相关的信息。
尽管在这个页面中只是列出了大多数重要的方法,但是完整的EventEmitter2 API在grunt.event对象中都是有效的。Event命名空间可以使用.(点)操作符指定,还可以启用命名空间通配符。注意grunt并不允许你公开发布任何events(事件),但是在你自己的任务中仍然是有用的。grunt.event.on给指定的事件监听器数组尾部添加一个监听器。grunt.event.on(event, listener)grunt.event.
访问定义在Gruntfile中项目特定的配置数据。注意任何使用☃(unicode形式的雪人)标记的方法直接用在grunt对象上都是有效的,任何在任务内部使用☆(白色星星)标记的方法用this访问也是有效的。你只需要知道这些就行。初始化配置数据注意下面的方法在grunt对象上如同在grunt.initConfig中都是可用的。grunt.config.init为当前项目初始化一个配置对象。
关注时代Java