Press "Enter" to skip to content

从零开始为Web项目定制构建系统(二)——版本跟踪系统

git版本跟踪系统 可以理解为 build sys的子系统,类似于 测试子系统,因它们共用同一个系统工作目录;然而,git版本跟踪系统 比测试等「build子系统」更具独立性,因为它使用独立的工具或技术基础(git 独立于nodejs)和操作接口(git不使用npm script执行,不是构建任务的一项)。

不管怎样,版本跟踪任务 还是现代软件项目管理、构建、协作和分享的重要一环。在继续给我们的构建系统增加功能之前,先将为它添加版本跟踪系统(或者叫加入到项目管理之中)。

EM:「项目目录」是多个逻辑任务的宿主,版本管理,和软件构建是软件管理并行的两个任务。

设计大于系统,系统大于创建提交

对很多实践爱好者来说,最有价值的「版本跟踪任务」是创建和提交新版本 commit(git add / commit),还有与远程仓库推拉更新(git push/pull),然而,这些日常版本跟踪任务的前置条件(git init)更具价值,例如整个「分布式版本跟踪系统」的原理知识;当然,还有比此二更具价值的知识,那就是具体的commit,branch, repo的版本设计;简单的说,「版本设计」就是有关一个commit里有怎样的版本增量数据,一个branch有怎样的commit历史 和一个repo应该有怎样的branch结构等设计策略。

添加git 系统

OK,意义,和理论讲这么多。开始操作。

给我们的Web project(a-wgp) 添加git 系统分两步:

  • 第一,创建repo;
  • 第二,发布到github(我们未必一定需要远程协作,也未必选github,但是一般规模的项目都有远程协作的需求,所以创建分布式版本管理是很有必要)

从现有项目上创建repo

$ cd a-wgp
$ git init ## 初始化一个repo,体现在创建一个隐性目录.git
$ git add . ## 将项目所有文件添加到暂存区,构建第一个commit
$ touch .gitignore && git add .gitignore ## 创建过滤配置文件,并添加到暂存区,加入跟踪
$ git commit ## 提交,并根据提示在vim编辑界面上输入commit描述

添加了git系统的build sys 文件系统构成

[keminlau@localhost a-wgp]$ tree -a
.
├── build
├── .git
├── .gitignore
├── package.json
└── src
    ├── app.js
    └── index.html

发布到 github

我们现在在本地已经有了一个repo,将它发布到github的意思是说,将在 github 的服务器创建一个远程的repo,并将俩关联而 构建一个分布式版本跟踪系统。完成创建分布式系统需要两个能力条件:

  • 第一,掌握「git分布式系统」创建和配置的知识;
  • 第二,掌握github的创建和推送repo的知识;包括「SSH系统」的配置的知识;

我们大概的任务步骤是,先在 github 上创建一个同名空repo,再在本地进行分布式系统配置,最后将本地的repo数据“推”上远程repo,以此来完成分布式系统的创建。

创建一个同名空repo

• 转到 github 登录你的帐户
• 单击右上角的 new repository 按钮。你可以选择用一个 README 文件来初始化 repository
• 填写项目信息
• 单击“Create repository”按钮

有了远程repo,接着要配置远程通信。github支持HTTPS和SSH两种登录 ,这里只使用了SSH,据说HTTPS更流行

配置本地SSH 登录客户端

要将本地数据传输上服务器,我们需要Secure Shell (SSH) 系统进行安全通信,这功能一般操作系统会默认安装。但可能需额外的配置。

「SSH系统」有多个工作模式,其中最流行是使用「密钥对认证」登录,所以需配置SSH keys,其中私钥在本机,公钥在服务端;我们配置步骤有:

第一,先在本机生成(如果之前没有生成过)密钥对,并(可选)对私钥进行口令(passphrase)加密;

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
> Generating public/private rsa key pair.
> Enter a file in which to save the key (/home/you/.ssh/id_rsa): [Press enter]
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]

注:-C 参数不能随意,必须是你的github email数据

「密钥对」是对远程登录验证加密,而「私钥口令」则是对私钥本身加密,以防盗用。如果添加了私钥口令,则每次登录操作都输入口令,也可通过ssh-agent代劳(此任务待定,此处不使用私钥口令)。

第二,拷贝公钥数据,配置服务端;

配置远程(github)SSH 服务端

这个主要通过github界面,添加公钥数据

  • 转到你的github帐户设置
  • 点击左侧的“ SSH and GPG keys”
  • 点击右侧的“Add SSH Key”
  • 添加title(例如“nakeman at home”),然后将公钥粘贴到大文本框中

链接测试

$ ssh -T git@github.com

有“成功认证”信息表示成功链接。

配置本地git 并推送repo

主要是配置步骤:添加远程(remote)库关联,和tracking branch

[keminlau@localhost a-wgp]$ git remote add origin git@github.com:nakeman/a-wgp.git

[keminlau@localhost a-wgp]$ git branch --set-upstream-to=origin/master master

推送

[keminlau@localhost a-wgp]$ git pull

[keminlau@localhost a-wgp]$ git pull --allow-unrelated-histories

[keminlau@localhost a-wgp]$ git push -u origin master

由分布式系统创建的顺序未考虑周全,这里有一个小“BUG”,推送不是很顺利。由于分别分布式两端都创建了新库,并提交了初始版本(init commit),这样,当前系统状态是 远程端已经有了新版本,不能直接推送(push),要先拉取(pull)数据。而拉取时发现了“unrelated-histories”,故还不能直接拉取,要强行拉取(–allow-unrelated-histories)。

正确的创建顺序应该先在Github上创建空的中心库(origin),再克隆到本地,在这个克隆的基础上创建分布式版本跟踪系统:把项目添加进去,创建初始版本,再推送,就不会产生一个分支两个不相关的历史commit了。

小结

严格的git工作流程:

  • 第一,分布式系统先创建中心库origin,再在客户端克隆操作,完成分布式系统创建;
  • 第二,添加commit要在一个工作分支上,而不要master上直接commit;
  • 待补充……

参考

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *