22.6 Topgit使用中的注意事项

1.经常运行tg remote—populate获取他人创建的特性分支

运行命令git fetch或命令git pull和远程版本库同步,只能将他人创建的Topgit特性分支在本地以远程分支(refs/remotes/origin/t/<branch-name>)的方式保存,而不能自动在本地建立分支。

如果确认版本库是使用Topgit维护的话,应该在和远程版本库同步的时候执行tg remote—populate origin。这条命令会做两件事情:

自动调用git fetch origin获取远程origin版本库的新的提交和引用。

检查refs/remotes/origin/top-bases/下的所有引用,如果是新的,在本地(refs/top-bases/)尚不存在,说明有其他人创建了新的特性分支。Topgit会据此自动在本地创建新的特性分支。

2.适时地调整特性分支的依赖关系

例如之前用于Topgit演示的版本库,各个特性分支的依赖文件内容如下。

分支t/feature1的.topdeps文件


master


分支t/feature2的.topdeps文件


master


分支t/feature3的.topdeps文件


t/feature1

t/feature2


如果分支t/feature3的.topdeps文件是这样的,可能就会存在问题。


master

t/feature1

t/feature2


问题在于t/feature3依赖的其他分支已经依赖了master分支,虽然不会造成致命的影响,但是在特定情况下这种重复会造成不便。例如在master分支更新后,可能由于代码重构的比较厉害,在特性分支迁移时会造成冲突,如在t/feature1分支中执行tg update会遇到冲突,当辛苦完成冲突解决并提交后,在t/feature3中执行tg update会因为先依赖的是master分支,所以先在master分支上对t/feature3分支进行合并,这样就肯定会遇到和t/feature1相同的冲突,还要再重复解决一次。

如果在.topdeps文件中删除了对master分支的重复的依赖,就不会出现上面的重复解决冲突的问题了。

同样的道理,如果t/feature3的.topdeps文件写成这样,效果也将不同:


t/feature2

t/feature1


依赖的顺序不同会造成合并的顺序也不同,同样也会产生重复的冲突解决。因此当发现重复的冲突时,可以取消合并操作,修改特性分支的.topdeps文件,调整文件内容(删除重复分支,调整分支顺序)并提交,然后再执行tg update继续合并操作。

3.Topgit特性分支的里程碑和分支管理

Topgit本身就是管理特性分支的软件。Topgit某个时刻的开发状态是Topgit管理下的所有分支(包括基准分支)整体的状态。思考一下:能够用里程碑来标记Topgit管理的版本库的开发状态吗?

使用里程碑来管理是不可能的,因为Git里程碑只能针对一个分支做标记而不能标记所有的分支。使用克隆是唯一的方法。克隆不但用于标记Topgit版本库的开发状态,也可以用于Topgit版本库的分支管理。例如一旦上游出现新版本,就从当前版本库建立一个克隆,原来的版本库用于维护原有上游版本的定制开发,新的克隆版本库针对新的上游版本进行迁移,用于新的上游版本的特性开发。

也许还可以通过其他方法实现,例如将Topgit所有相关的分支都复制到一个特定的引用目录中或记录在文件中,以实现特性分支的状态记录。