Git目前的代码分支管理模型中,比较主要的有Git-Flow、Github Pull Request。大家日常或多或少都在用着。

在不想安装Gitlab这种重量级的环境的情况下,如果是利用git一步步搭建团队的GIT服务的话,比较麻烦,而且维护更麻烦。Gitblit是一款比较简单的跨平台Git自托管服务器软件,支持多种授权机制整合。

比如,像前面介绍过的,给禅道项目管理系统做了一个兼容redmine rest格式的用户接口后,http://www.cnblogs.com/x3d/p/4539246.html,就可以轻松的与gitblit整合了。

Gitblit自己也定义了一种基于Ticket的代码分支开发模型。

创建标准式工单

标准式工单(Standard ticket)是通过Gitblit Web 界面创建的。这种工单可以包含 Bug, Enhancement, task, 与 Question等类型。

创建提议式工单

提议式工单(Proposal ticket)是在推送一次单步提交(single commit )的代码时创建的,通过推送到指定魔法ref目标来实现。在Web 界面中无法创建这种工单。

为什么会有这种单步提交的限制呢?

因为要从你这次提交的消息中提取工单的标题与描述。工单创建之后,你可以随意的提交代码到该工单对应的魔法分支。

什么情况下创建提议式工单?

首先懒得打开Web UI来创建工单啊。这种工单提供了一种很便捷的机制,允许你通过Git操作就可以对工单进行变更。

哪些人可以创建这种工单?

拥有clone仓库权限的任意授权用户。

git clone https://server/r/repo.git
cd repo
git checkout -b mytopic
...add a single commit...
git push origin HEAD:refs/for/new
# read ticket id from server output
git branch -u origin/ticket/{id}

给已有的工单提交首个补丁集

对于那种尚未提交补丁集(patchset)的工单,可以到对应的工单分支ref来推送。

哪些人可以创建首次补丁集?

拥有clone仓库权限的任意授权用户

git clone https://server/r/repo.git
cd repo
git checkout -b ticket/{id}
...add one or more commits...
git push -u origin ticket/{id}

向现有工单的补丁集安全的提交代码

哪些人可以向现有补丁集添加提交?

  • 工单创建者
  • 补丁集的初始创建者
  • 在工单设置界面中被设置成负责人的人
  • 拥有对所在的该仓库读写权限的任意用户
git fetch && git checkout ticket/{id}
git pull --ff-only
...add one or more commits...
git push

对已有补丁集的现存工单,想检出命名化分支

默认检出的工单分支是那种整数ID形式的,如果你想给本地工单分支命名的话,可以用下面的命令语法来实现。

git checkout -b my_fix --track origin/ticket/{id}

这样命名为my_fix的本地分支会跟踪到上游的工单分支。

重写某个补丁集(amend, rebase, squash)

哪些人可以重写补丁集?

Gitblit会检测非快进式更新并创建新的补丁集ref。这就保护了以前的补丁集。

git fetch && git checkout ticket/{id}
git pull --ff-only
...amend, rebase, squash...
git push origin HEAD:refs/for/{id}

或者如果你有RW+的权限,你可以直接用-f标识推送。

git push -f

对于重写了的补丁集更新你的工作副本

如果补丁集被重写,你不能在简单的通过pull来更新。将你的分支更新到当前补丁集的最简单方式,是用-B标识reset。

git fetch && git checkout -B ticket/{id}

如果你有未提交的代码,你可以创建一个新的临时分支,然后将你的变更以cherry-pick的方式合并到重写后的补丁集。

git branch oldticket ticket/{id}
git fetch && git checkout -B ticket/{id}
git cherry-pick <commitid1> <commitid2>
git branch -D oldticket

Git是非常灵活的,还有很多其他的策略来解决这种情况的问题。

Gitblit中工单Ref声明格式规范(RefSpec)

Gitblit支持两种原始的ref推送声明格式:魔法式ref与补丁集ref。

创建新的提议式工单

ref description
refs/for/new 为默认分支新建工单
refs/for/default 为默认分支新建工单
refs/for/{branch} 为指定分支新建工单

向现存工单添加提议式补丁集(第一个补丁集)

ref description
refs/for/{id} 添加新的补丁集到现存工单

添加提交到现存补丁集

ref description
refs/heads/ticket/{id} 快进式提交到现存补丁集

重写补丁集 (amend, rebase, squash)

魔法式ref 描述
refs/for/{id} 用于重写补丁集

工单 RefSpec 小诀窍

在refspec推送语法中,支持直接设置一些工单字段。

refs/for/master%topic=bug/42,r=james,m=1.4.1,cc=dave,cc=mark
参数 描述
t 指定工单的主题
r 设置负责人
m 设置补丁集集成到的里程碑
cc 将指定的一个或多个帐号添加到watch列表

示例

要给编号为12的工单创建新的补丁集,并将james与mark两人添加到watch列表,将主题设置为JIRA-123。注:这个格式的主题可以通过正则匹配的方式关联到bugtraq配置。

git push origin HEAD:refs/for/12%cc=james,cc=mark,t=JIRA-123

添加一些提交(快进式)到#12号工单,对应里程碑为 1.4.1。

git push origin HEAD:refs/heads/ticket/12%m=1.4.1

合并补丁集

Gitblit的Web界面提供了合并按钮,会将补丁集干净的合并到集成分支上。

复杂的合并场景,最好是用Git客户端来合并。做这种操作有很多种方式,这里提议一种安全的合并策略 - 将代码pull到一个新的分支、然后快进式合并到你的集成分支,假定你很乐意进行pull(merge)操作的话。

git pull origin master
git checkout -b ticket-{id} master
git pull origin ticket/{id}
git checkout master
git merge ticket-{id}
git push origin master
git branch -d ticket-{id}

通过push一个全新的补丁集来关闭工单

Gitblit会在推送到普通分支时,茶轴补丁集引用。如果找到引用或者在前一次合并说明中发现,该工单被以合并的类型被设置为已解决。并通过所有人。

如果你不需要创建用于评审的补丁集,你可以直接推送包含 fixes #1或 cloes #1这样字符的提交到集成分支。Gitblit会标识出该工单,创建以那次提交为说明的新补丁集、并且将工单“解决”为已合并。

利用补丁集重新开启工单

Gitblit允许你通过合并补丁集来重新开启工单。既然Gitblit运行补丁集重写及版本化补丁集,逻辑上是可行的。如果合并的提交没有实际上解决掉该工单时,对于新特性需求或bug报告就无需创建另一个工单。

这让你可以继续该讨论,并新创建希望解决该需求的补丁集。

注意:你无法推送补丁集到一个已经关闭的工单,Gitblit会拒绝。必须线充Web界面重新开启,才能做后续的操作。

评审

Gitblit 包含了一种非常简单的补丁集评分机制。Gitblit不是代码评审系统,但可以满足一些简单的需求。

  • +2, 通过:补丁集可以被合并
  • +1, 看起来是好的:必须由其他人通过后才能合并
  • -1, 需要改进:请不要合并
  • -2, 被否决:补丁集不能被合并

拥有读写权限的用户可以给+/-2的分数,其他用户只允许+/-1分。如果该仓库被设置为“require approval”,那么+2分就有更重要的意义。合并按钮仅会在至少有一个+2且没有-2的分数时出现。如果出现-2的打分,在Web界面上合并操作会被屏蔽。有读写权限的用户仍然可以手动合并并推送补丁集到集成分支;Gitblit不会在push时强制否决补丁集。

评审及更新的或重写的补丁集

如果该补丁集被更新或重写,以前的所有评审打分会被忽略掉;评审打分应用到补丁集的指定版本 - 通过与否没有什么区别。

英文原文:http://gitblit.com/tickets_using.html

Gitblit中采用Ticket模式进行协作开发的更多相关文章

  1. 基于SqlSugar的开发框架循序渐进介绍(7)-- 在文件上传模块中采用选项模式【Options】处理常规上传和FTP文件上传

    在基于SqlSugar的开发框架的服务层中处理文件上传的时候,我们一般有两种处理方式,一种是常规的把文件存储在本地文件系统中,一种是通过FTP方式存储到指定的FTP服务器上.这种处理应该由程序进行配置 ...

  2. Vue-cli3.x在开发环境中(router采用 history模式)出现Failed to resolve async component default: Error: Loading chunk {/d} failed.或者Uncaught SyntaxError: Unexpected token <错误

    使用Vue-cli3.x开发环境中(router采用 history模式)出现Failed to resolve async component default: Error: Loading chu ...

  3. GitHub Flow & Git Flow 基于Git 的两种协作开发模式

    介绍基于Git 两种协作开发模式,GitHub Flow & Git Flow 对于Github 一些好用的特殊操作技巧 ,可以见GitHub 特殊操作技巧 和Git的基本操作 一 GitHu ...

  4. Gitblit搭建及Git协作开发流程

    1. 概述 目前主流的是git作为自己代码管理,但是采用github需要付费才能够使用,如果不付费,代码需要公开.创业团队及小型开发团队都有必要搭建自己的代码服务器,自己摸索需要一定的时间,会赶不及项 ...

  5. Web前端开发中的MCRV模式(转)

    作者: izujian  来源: baiduux 摘要:针对前端开发中基于ajax的复杂页面开发所面临的代码规模大,难以组织和维护,代码复用性.扩展性和适应性差等问题,本文尝试以MVC思想为 基础,结 ...

  6. C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

    我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...

  7. 二十七、EFW框架BS系统开发中的MVC模式探讨

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  8. MVP模式在Android开发中的应用

    一.MVP介绍      随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互.同一 ...

  9. es6 中,大多数开发者和 babel 之类的工具默认添加 use strict 到 JS 文件的头部,确保采用严格模式

    严格模式(use strict) 有助于防止问题用法,并且它也有助于安全使用 JavaScript. 在 ES5 中, 严格模式是可选项,但是在 ES6 中,许多特性要求必须使用严格模式. 因此大多数 ...

随机推荐

  1. atitit 短信接口规范与短信解决方案.docx

    atitit 短信接口规范与短信解决方案.docx 1.1. 国内比较著名的短信提供商1 1.2. 短信接口规范1 1.3. 短信sdk构成1 1.4. 短信的实现1 1.5. SmsServiceY ...

  2. paip.2013年技术趋势以及热点 v2.0 cae

    paip.2013年技术趋势以及热点 v2.0 cae HTML5 多核编程 物联网 可穿戴计算设备 3. 物联网 无论是M2M(机器对机器)通信应用,还是NFC(进距离通信)技术,都是物联网的组成部 ...

  3. paip.mysql 性能测试 报告 home right

    paip.mysql  性能测试 报告 home right 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog ...

  4. EasyUI Datagrid Datetime(EasyUI DataGrid 时间格式化)

    EasyUI DataGrid 时间格式化 方法一: var Common = { //EasyUI用DataGrid用日期格式化 TimeFormatter: function (value, re ...

  5. Oracle 11gR2静默安装 & 命令行安装

    静默安装 经常搭建Oracle测试环境,有时候觉得OUI(即图形界面)方式甚是繁琐,你得一步一步进行确认,所幸,Oracle支持静默安装.在我看来,它主要有两方面的好处:一.极大地提升了效率,尤其是批 ...

  6. PHP Log时时查看小工具

    以前Log都是打印在一个文档中,然后打开文件夹,最后打开文档查看里面的内容,每次打开文件夹感觉很烦. 前些日子看到同事开发.NET的时候,用他自己的一个小工具能够时时查看到Log的内容,非常方便,所以 ...

  7. Android基于mAppWidget实现手绘地图(十)–在放大前后执行一些操作

    为了在放大前后执行一些操作,你需要添加MapEventsListener 的实例到MapWidget,使用MapWidget.removeMapEventsListener移除该监听器. mapWid ...

  8. Primer – 支撑 GitHub 的 CSS 工具包和准则

    Primer 是一个 CSS 工具包,支撑着 GitHub 的前端设计.它的目的仅限于提供通用部件,为我们的开发者提供最大的灵活性,并保持 GitHub 的独特风格.它基于 SCSS 建成,可以通过 ...

  9. SQL中利用DMV进行数据库性能分析

    相信朋友对SQL Server性能调优相关的知识或多或少都有一些了解.虽然说现在NOSQL相关的技术非常的火热,但是RMDB(关系型数据库)与NOSQL是并存的,并且适用在各种的项目中.在一般的企业级 ...

  10. Java中如何将String转成Date

    Java中如何将String转成Date 最近在开发Json数据反序列化为Java对象的时候发现spring mvc 和 Jackson 对Date类型对支持不是特别好,虽然在Java对象序列化为Js ...