提高分支管理,就不得不提Vincent Driessen很早之前提出的策略,他提出来几点
下面沿着经典的 master 和 dev 分支模型,讲两点保证 history 干净的方法。
小型 feature,or bug,能够在几小时内解决的 branch,可以使用 squash merge
# under master
git merge --squash private_feature_branch
对于大型分支,大型功能,可能需要花费长时间 working,需要提交数百次commit的分支,那么使用 squash
可能会导致一次提交有成千上万行代码,非常不利于 code review。那么这个时候就需要使用 rebase
的交互模式。可以参考之前的文章 来学习一下rebase基本的使用。
rebase 的交互模式非常强大,可以用来修改过去的提交,分割提交,合并提交,甚至重新排序提交。
# on feature branch
git rebase --interactive master
git rebase -i master
当使用交互式rebase时,会显示一个编辑器,其中包含了一系列的命令和提交,比如下面三次提交,默认都为 pick,表示不修改该 commit,
pick 9c422c5 Fix bug
pick 8821164 Change html
pick 89e9f73 Update
将第二次提交修改为 s
, squash
,并保存
pick 9c422c5 Fix bug
s 8821164 Change html
pick 89e9f73 Update
那么第二次提交就会合并到第一次提交,最下面的提交为最新的提交,从上到下为旧->新,当保存退出时会弹出新的编辑器,可以在该编辑器中,书写新的提交信息,然后保存。
不过需要注意的是,永远不要改写 public 或者 master 已经发布的分支。
这几点都是老生常谈的要点了,经典的分支模型理论上除了 master 和 develop 分支外,其他分支都不应该存在于远程仓库中。当然理论和实际总是有出入的。Vincent Driessen 的分支模型固然合理,但是并不能满足所有的开发需求。
--no-ff
来合并分支,会出现额外的 Merge branch xxx of [email protected]
这样的无意义的 commit 出现,导致 master 线非常杂乱如果考虑所有的开发都在 master 上进行,本地开发者需要经常 git rebase
将 origin/master
上最新内容拉到本地,开发者推荐在本地维护小型的分支,一旦有可使用的代码立即提交到 master 中持续集成,从提交到合并中间可以加上 review 和 test 。
当所有的开发都在 origin/master
上进行时,开发者需要将所有的修改在最新的远程master上惊醒,以保证每次的开发都能够正常被合并而不会产生冲突。保证了这一点就可以避免在大量feature分支合并时产生的 integration hell。
如果使用 Gerrit,或者 Phabricator 等等 code review 工具那么这些集成就更方便了
每一个发布都有自己的 tag,并且有独立于 origin/master
的分支,加入有 hotfix,那就直接添加到 release 分支,并且 cherry-pick 到 master 分支。如果使用固定的 tag 和 分支命名方法,可以使用CI自动针对 tag 发布,整个过程对开发流程透明,开发者甚至可以不关心发布,而只关心 tag,让后面的流程自动在 CI 中执行。
避免大量的无意义的 merge commits 将仓库搞的乱七八糟,只使用 git rebase
或者 git cherry-pick
,rebase 可以让历史提交线非常清晰,这样 git bisect
也能快速的定位到问题。
如果使用了 Gerrit,那就意味着提交了一组 commit 到 origin/master
,你可以使用 cherry-pick 来任意调整 commit 的顺序。
NextCloud 就不多介绍了,把他看成一个 Dropbox 的私人托管版本,相比于将数据交给 Dropbox ,NextCloud 则需要自己负责自己数据的安全。这里记录下使用过程中的一些问题吧。
推荐使用 Docker compose 来安装 熟悉 Docker 的情况下,基本上是一键安装的。
docker-compose up -d
然后享受 NextCloud 带来的极速体验吧。
NextCloud 的日志可以在这里查看:
tail nextcloud/data/nextcloud.log
虽然默认 NextCloud 自带的插件已经非常丰富了,但是有些功能还是需要一些插件才能完成,幸好 NextCloud 的插件库已经非常丰富,直接 admin 后台点击安装即可。我在使用过程中,发现视频,文档都可以预览,而 mp3 文件点击之后竟然直接给下载了,所以找到了 audioplayer 这样一个插件,可以让我在线预览歌曲。
而关于其他的安全的,媒体的很多插件都可以在插件库或者应用库中找到。二步验证的推荐安装。
NextCloud 的权限管理已经非常详细了,公开分享,私密密码分享,过期时间,完全能够满足所有的分享需求,在看使用 Manual 的时候,发现 NextCloud 和 Dropbox 一样可以设置一个公开文件夹,然后别人可以通过该文件夹来给你上传文件,这个也是非常不错的了。
除了 Dropbox 那么良心,所有平台都提供客户端之外,我也只有见到 NextCloud 那么良心提供全平台的同步客户端了。
sudo add-apt-repository ppa:nextcloud-devs/client
sudo apt-get update
sudo apt install nextcloud-client
PPA 中安装,也可以直接下载 AppImage。其他两个平台就直接安装就行。
来最后给大家分享一首歌:https://nc.einverne.info/s/SbN7zYBKiHMeWs5
如果要手动安装,那么就需要依赖一些服务:
MySQL 5.7
sudo apt install php7.2 php7.2-cli php7.2-common php7.2-curl php7.2-fpm php7.2-gd php7.2-zip php7.2-mbstring php7.2-mysql
NextCloud 提供一个监控的地址,可以用来外部监控 NextCloud 运行状态:
http://[ip]:[port]/ocs/v2.php/apps/serverinfo/api/v1/info?format=json
返回信息中包含很多有用信息,比如服务器当前状态,运行的 NextCloud 版本,存储剩余空间,分享数据, web 服务器版本,数据库版本等等。
同类型的工具还有 [[OwnCloud]],[[Seafile]], [[CloudReve]] 可以根据自己的偏好选择一个即可。
因为所有的数据都需要自己来保管安全,所以一方面要做到服务器的安全,另一方面也要保证 NextCloud 的安全,到目前为止,我还是依然使用 Dropbox 作为主要个人存储同步,NextCloud 作为 backup。如果你从来没有听说过 Dropbox 那么可以使用我的邀请 https://db.tt/isyvu6ny 来注册,你我都可以多得 500M 空间。对我而言这 500M 的空间远比某盘 1T 的空间要重要的多。如果你认为 Dropbox 仅仅是一个同步盘的话,请参考下这篇 文章,你不仅能够拿 Dropbox 来托管静态文件,甚至可以借用 IFTTT 来完成很多意想不到的事情。
为什么现在这个时机突然关注了 .xyz
这个域名呢,最直接的原因是,疼讯云给了我100元的优惠券,看了一圈续费VPS似乎不太划算,算来算去也只有购买一个域名值得一些,但是看了一圈疼讯提供的顶级域名,.cn
臭名远扬是不会买的,.com
几乎已经注册不到好记的域名了,.info
我自己有了一个einverne.info
再买个似乎也不知道买什么好了,于是 .xyz
这个很显眼的域名成为了我考虑的目标。然后突然想起来字母表公司(对就是那个 alphabet 公司),他的官网是 https://abc.xyz 好记又贴合名字,顿时看到了希望。
关注域名的人应该会经常看到这个词 gTLD, 全称是 generic Top Level Domain,中文是通用顶级域名,通俗的来讲也就是我们经常遇到的 .com
, .net
, .org
等等域名后缀。不同国家有自己的国家顶级域名,比如中国的 .cn
,还有美国的 .us
,还有日本的 .co.jp
等等,不同的行业机构也都有不同的后缀,一般学校教育机构会有 .edu
,政府机构会有 .gov
,军事机构会有 .mil
等等。1
提到 .xyz
域名就不得不提到 Daniel Negari ,在无数的报道中,Negari 因为独到的眼光预先将 .xyz
的通用顶级域名给注册了,所以让 .xyz
变得成为 .com
之后渐渐流行的通用顶级域名。他在采访中说的最多的一句话就是字母表既然以 .xyz
结尾,那么域名也应该如此2。在 Google 重组还没有使用 abc.xyz
域名前,每天有 3000 多注册,而 Google 重组成 Alphabet 之后每天的注册量已经上升到 10000.
很多人追问的一个问题就是 .xyz
域名会不会火,其实面对着越来越多的通用顶级域名,其实原本稀缺的 .com
域名早已经成为了互联网的历史,如果说以前人们还只认识 .com
, .org
那么互联网的使用者是会变的,当足够多的人认可了以顶级域名,那么自然不在会有一个 .com
的域名再能够卖几千万几百万了。
想必看到这里很多人会想问,与其说去买一个 .com
的域名,还不如自己去注册一个顶级域名,其实注册顶级域名是有门槛的, ICANN 每几年都会开放一次注册,比如 .xyz
就需要 $185,000 来获取。如果想要获取自己的 gTLD,那么需要提交一份完整的申请,还有准备好大约 $200,000 美金,当然还要排除掉你想要注册的顶级域名没有人来和你抢。ICANN 有一份简单的说明几乎可以涵盖经常被问到的事情。
Paul Graham (著名初创企业投资人)在他自己的博客 写过关于初创企业命名相关的内容,他说“如果你开始了一个 X 企业,但是你拿不到 X.com,那么你就应该考虑改名字”,这一句话不仅道出了 .com
域名在互联网的地位,也让我们看到了起名对一个企业的重要程度,也才会出现天价的域名购买。
于是我就顺着这个线索,找了一些有意思的企业,找一找他们的名字的由来,Google 自然不比说,于是我先找到了 Trello ,之前 也介绍过的一个看板类应用。在 Quora 上面我找到了这样一篇文章,经历过早期创业的人提到了他们苦恼如何命名自己的产品,从内部代号 Trellis ,到他们雇一名专业起名的人给出 “lasagna” ,到全公司头脑风暴给出各种谐音,日语结合,单词拼凑, Kardboard,Hippolist,Listly,Idealist,经过无数的讨论,他们甚至想要去买 trell.is 域名,但是价格无法接受,最终在没有给注册的 .com
与域名中,他们找到了 trello.com
。那一切讨论就终止了。
还有Amazon 原来叫 Cadabra.com ,但是因为不好记,很快就被淘汰了。后来 Bezos 自己发现了 amazon.com
3。
GitHub Pages 可以用来托管静态网站,而 Jekyll,Gitbook 等等程序都可以生成静态网站,那么如果使用 master 分之托管源码的话, gh-pages
分支就可以用来托管静态网站。而使用 Travis 就可以将每一次 master 分支的提交,自动编译静态站点之后提交到 gh-pages
分支。
既然要使用到 git 的推送,那么必然避不了需要验证,Travis 提供很多验证方式,这里有两种:
加密 TOKEN,需要使用到 GitHub 提供的 Personal API tokens,Token 与 帐号密码 以及 SSH Keys 同样具有 Github 写入能力,因此只要使用 Travis CI 提供的加密工具来加密这个 Token 即可。
Travis CI 会使用一对密钥中的 Public Key 来加密提供的 TOKEN,然后得到的 secure token 可以安全地放在 .travis.yml
文件中,在 Build 的时候 Travis 会使用 Private Key 来解密这个 Secure Token 获取最初提供的 Github Personal Access Token,并使用该 TOKEN 来进行一系列操作。
操作具体步骤:
gem install travis
travis login --github <token>
travis encrypt GH_TOKEN=<token>
,使用 travis encrypt ...
命令会生成加密的字符串,把字符串添加到 .travis.yml
文件中或者使用额外的参数 --add ...
比如 travis encrypt <token> --add deploy.github-token
可以自动添加到 .travis.yml
文件中,会自动在 deploy 下创建 github-token
来存放加密字符串。
更多的 travis
的使用可以 travis -h
来查看。
下面以 Gitbook 使用 Travis 自动编译部署到 GitHub Pages 为例,这里使用到了 Travis 的发布到 GitHub Pages 的功能。
language: node_js
node_js:
- "8"
before_install:
- export TZ='Asia/Shanghai' # 更改时区
# 依赖安装
install:
- npm install gitbook-cli -g
# 安装 gitbook 插件
- gitbook install
# 构建脚本
script:
# 自定义输出目录 gitbook build src dest
# 默认会输出到 _book 目录下
- gitbook build .
# 分支白名单
branches:
only:
- master # 只对 master 分支进行构建
before-deploy:
- git config --local user.name "Ein Verne"
- git config --local user.email "[email protected]"
# GitHub Pages 部署
deploy:
provider: pages
skip_cleanup: true
github_token:
secure: <secure token>
# 将下面的目录中内容推送到 gh-pages 分支
local_dir: build
fqdn: $CUSTOM_DOMAIN
name: $GIT_NAME
email: $GIT_EMAIL
on:
branch: master
大概原理就是如此,记住 skip_cleanup: true
这个一定要写上,否则 Travis 在 build 的时候会自动清理掉 repo 中编译生成的内容。
before_install
在安装之前,设置时区install
安装依赖script
执行真正的脚本before_deploy
部署之前做的事情deploy
部署发布内容本地使用命令
travis lint .travis.yml
实例使用可以参考这个例子
Git 本来是一个版本控制工具,多人协作工具,但却爆发出无限的潜能,于是有人开始使用Gitbook来写书,设计师们用Git来管理版本。这篇文章主要就是想要介绍一下 [[GitBook]] 的简单使用。
Gitbook 使用 Markdown 作为书写格式,Git 来做版本控制,结合两者来编排书籍。Gitbook 的安装非常方便,在本地有 Node.js 和 npm 的环境下
npm install gitbook-cli -g
gitbook -V # 检查版本
就能够安装 gitbook 命令。
Gitbook.com 是一个发布 gitbook 编写书籍的在线网站,提供公开和私有的托管服务,和 GitHub 一样,私有的 Gitbook 是需要付费使用的。但是公开的书籍是无上限的,使用在线的 Gitbook 可以让未接触过 Git 和 Markdown 的作者轻松的创建书籍,并且在线的编辑器可以让作者安心的只关心内容,而不必在意排版,并且支持多人协作编写。
gitbook 的使用可以简单的归纳为如下两步:
在使用 gitbook init
之后本地会生成两个文件 README.md
和 SUMMARY.md
,这两个文件都是必须的,一个为本书介绍,一个为本书目录结构。
Gitbook 拥有很多插件来扩展 Gitbook 的功能,比如支持数学公式,支持Google统计,评论等等。插件可以在 https://plugins.gitbook.com/ 找到。
插件安装比较简单,在目录下添加 book.json
文件,填写下面格式
{
"plugins": ["plugins1", "plugins2"],
"pluginsConfig": {
"plugins1": {...}
}
}
注册完插件之后,安装插件 gitbook install
。 插件开发可以参考官方文章
常用插件
alt
或者 title
属性显示在图片下如果不需要使用 Gitbook 自带的插件可以使用 -
来排除
"plugins" : [ "-search" ]
如果想知道更多关于 Gitbook 的使用,以及各种插件,主题的使用,可以具体参考 https://einverne.github.io/gitbook-tutorial
vmstat
是一个收集和报告系统内存,swap,处理器资源的工具,全称是 Virtual Meomory Statistics,虚拟内存统计,Linux 下监控内存经常使用的工具,可以对系统内存,CPU,进程进行监控。
vmstat reports information about processes, memory, paging, block IO, traps, disks and cpu activity.
vmstat
的使用非常简单,直接运行
vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 9496 1632720 1179760 4628968 0 0 9 37 55 12 3 1 96 0 0
输出一大串数据,第一行数据 vmstat 会计算从开机到运行命令这一时刻之间记录的平均数据。此后的每一次都是时间间隔内的情况。
vmstat [delay] [count]
第一行会打印平均值,之后每隔 [delay] 的时间,打印一次报告,在打印 [count] 次之后停止。
输出值解释
Procs
r: 显示多少进程在等待 CPU The number of runnable processes (running or waiting for run time).
b: 显示多少进程正在进行不可终端的休眠,等待 IO(The number of processes in uninterruptible sleep)
Memory
swpd: the amount of virtual memory used.
free: the amount of idle memory.
buff: the amount of memory used as buffers.
cache: the amount of memory used as cache.
inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)
Swap
si: Amount of memory swapped in from disk (/s).
so: Amount of memory swapped to disk (/s).
IO
bi: Blocks received from a block device (blocks/s).
bo: Blocks sent to a block device (blocks/s).
System
in: 每秒中断数量 The number of interrupts per second, including the clock.
cs: 每秒切换上下文次数 The number of context switches per second.
CPU
These are percentages of total CPU time.
us: 执行用户代码的时间 Time spent running non-kernel code. (user time, including nice time)
sy: 执行内核代码的时间 Time spent running kernel code. (system time)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.
使用 stress
命令进行测试,并对 vmstat
结果进行观察。先用一个终端打开 vmstat
,然后在其他终端输入 stress 响应的命令观察。
使用 4 worker 进行处理任务 sqrt() :
stress -c 4 -t 30
可以立即看到 vmstat 结果中 r
列,立即会显示 >= 4 个任务在进行。
使用 2 个 worker 进行 sync():
stress -i 2 -t 30
立即就能看到 IO 中 bi
和 bo
成倍上涨。
或者使用 -d
选项,读写 HDD
stress -d 2 -t 10
使用 2 个工作 worker 进行 malloc()
和 free()
,占用 4G 内存 20 秒:
stress -m 2 --vm-bytes 256M -t 20
能看到 memory 中 free 下降,另外如果计算机内存比较小,千万慎重,如果要测试一定使用超时机制,否则可能直接卡死系统。
当系统内存不足时,有几种表现:
parted
是 GNU 组织开发的一款功能强大的磁盘分区和分区大小调整工具,命令可以对磁盘进行分区和管理,和 fdisk
相比,能够支持 2T 以上磁盘。它可以处理最常见的分区格式,包括:ext2、ext3、fat16、fat32、NTFS、ReiserFS、JFS、XFS、UFS、HFS 以及 Linux 交换分区。
功能特点:
parted
有两种使用方式:
定义分区表格式
parted -s /dev/sda mklabel gpt
划分主分区
parted -s /dev/sda mkpart primary ext4 1 10G
划分逻辑分区
parted -s /dev/sda mkpart logic 10G 20G
查看分区情况
parted -s /dev/sda p
直接使用一行命令来完成分区操作
parted /dev/sdb mklabel gpt mkpart 1 ext4 1 5T
使用 parted /dev/sdb
来进入对 /dev/sdb
硬盘的管理。
在交互命令下可以使用如下命令
交互命令 | 功能 |
---|---|
mklabel gpt | 定义分区表格式,常用的有 msdos 和 gpt 分区格式,2T 以上硬盘选用 gpt |
mkpart p1 | 创建第一个分区,名称为 p1,在使用该命令后会选择分区的格式,分区起始位置,分区的结束位置 |
查看当前分区情况 | |
rm | 删除分区,之后会选择想要删除的分区‘ |
help | 帮助 |
quit | 退出 |
在划分分区之后,可以使用
mkfs.ext4 /dev/sdb1
来针对 sdb 磁盘上第一块分区进行格式化。然后挂载分区 mount /dev/sdb1 /mnt/sdb1
。
对于一块新的硬盘,如果没有 GUI 的界面来进行格式化,就需要用到这个命令了。
执行 parted /dev/sda
进入交互式命令之后。
可以使用 resizepart
命令来更改分区的大小。
resizepart partition end
说明:
print
查看,前面的数字编号就是这里的分区编号Linux 内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是 Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory 也不会自动释放。这就会导致你在 Linux 系统中程序频繁读写文件后,你会发现可用物理内存变少。
Linux divides its physical RAM (random access memory) into chucks of memory called pages. Swapping is the process whereby a page of memory is copied to the preconfigured space on the hard disk, called swap space, to free up that page of memory. The combined sizes of the physical memory and the swap space is the amount of virtual memory available.
Swap space in Linux is used when the amount of physical memory (RAM) is full. If the system needs more memory resources and the RAM is full, inactive pages in memory are moved to the swap space. While swap space can help machines with a small amount of RAM, it should not be considered a replacement for more RAM. Swap space is located on hard drives, which have a slower access time than physical memory.Swap space can be a dedicated swap partition (recommended), a swap file, or a combination of swap partitions and swap files.
Linux 通过一个参数 swappiness 来控制 swap 分区使用情况,swappiness 是控制系统使用 swap 分区的频率阈值,当 swappiness = 100 时,系统会积极使用 swap 分区,而当 swappiness = 0 时,系统会最大限度的使用物理内存。
Swappiness is a property for the Linux kernel that changes the balance between swapping out runtime memory, as opposed to dropping pages from the system page cache. Swappiness can be set to values between 0 and 100 inclusive. A low value means the kernel will try to avoid swapping as much as possible where a higher value instead will make the kernel aggressively try to use swap space. The default value is 60, and for most desktop systems, setting it to 100 may affect the overall performance, whereas setting it lower (even 0) may improve interactivity (decreasing response latency.)[1]
In short:
vm.swappiness = 0 - it will swap only to avoid an out of memory condition
vm.swappiness = 60 - default value
vm.swappiness = 100 - it will swap aggressvely
To temporarily set the swappiness in Linux, as root you set the value to 100 with the following command: echo 100 > /proc/sys/vm/swappiness
Permanent changes are made in /etc/sysctl.conf via the following configuration line (inserted if not present previously): vm.swappiness = 100
临时修改 swappiness 值可以通过以下两种方式:
手动修改文件
vim /proc/sys/vm/swappiness
# or
echo 10 > /proc/sys/vm/swappiness
或者
sysctl vm.swappiness=10
永久修改 swappiness 参数的方法就是在配置文件 /etc/sysctl.conf
里面修改 vm.swappiness 的值,然后重启系统
echo 'vm.swappiness=10' >>/etc/sysctl.conf
查看 swap 分区大小及使用情况,使用 free 命令
free -h
也可以使用 swapon 查看 swap 分区信息
swapon -s # --summary 显示 swap 的使用情况
swapon --show # 显示结果更好看
也可以直接查看文件
cat /proc/swaps # 和 swapon -s 相同
关闭交换分区
swapoff /dev/mapper/VolGroup00-LogVol01
缩小 swap 分区
lvreduce -L 8G /dev/mapper/VolGroup00-LogVol01
格式化 swap 分区
mkswap /dev/mapper/VolGroup00-LogVol01
启动 swap 分区,并增加到 /etc/fstab 自动挂载
swapon /dev/mapper/VolGroup00-LogVol01
在装完 Linux 系统之后,建立 Swap 分区有两种方法:
swap 分区大小设置
4G 以内的物理内存,SWAP 设置为内存的 2 倍。
4-8G 的物理内存,SWAP 等于内存大小。
8-64G 的物理内存,SWAP 设置为 8G。
64-256G 物理内存,SWAP 设置为 16G。
以 root 身份登入控制台,输入:
swapoff -a #停止所有的 swap 分区
用 fdisk 命令对磁盘进行分区,添加 swap 分区,新建分区,在 fdisk 中用”t”命令将新添的分区 id 改为 82(Linux swap 类型),最后用 w 将操作实际写入硬盘:
fdisk /dev/sdb
格式化 swap 分区,这里的 sdb2 要看,加完后 p 命令显示的实际分区设备名:
mkswap /dev/sdb2
启用新的 swap 分区:
swapon /dev/sdb2
为了让系统启动时能自动启用这个交换分区,可以编辑 /etc/fstab
, 加入下面一行
/dev/sdb2 none swap sw 0 0
创建要作为 swap 分区的文件:增加 1GB 大小的交换分区,则命令写法如下,其中的 count 等于想要的块的数量(bs*count= 文件大小)。注意这里的 of
后面的路径可以根据自己的环境变化。
dd if=/dev/zero of=/root/swapfile bs=1M count=1024
格式化为交换分区文件:
mkswap /root/swapfile #建立 swap 的文件系统
启用交换分区文件:
swapon /root/swapfile #启用 swap 文件
使系统开机时自启用,在文件 /etc/fstab 中添加一行:
/root/swapfile none swap sw 0 0
Phabricator 是最早发源于 Facebook 的代码 review 工具,后来创始人离开 Facebook 独立开发这款工具。Phabricator 和同类型的 Google 的 gerrit 有着相似的功能。
Phabricator 提供了个命令行叫 arc (Arcanist),使用 arc
命令来连接开发者和 Phabricator 服务器。
brew install node
npm install -g arcanist
arc help
arc upgrade
在 Linux 下使用
sudo apt update && sudo apt-get install php7.0-cli php7.0-curl php-pear
# 任意其它目录也可以
mkdir ~/phabricator
cd ~/phabricator
# 如果下载慢的话,可以先尝试设置一下 proxy: export https_proxy="ip:3128"
git clone https://github.com/facebook/libphutil.git
git clone https://github.com/facebook/arcanist.git
# 编辑~/.bashrc,加入如下一行,之后 source ~/.bashrc
export PATH="$PATH:$HOME/phabricator/arcanist/bin/"
# 如果没有项目配置,可以运行下面的命令设置全局的参数:
arc set-config default https://<phabricator server address>
arc install-certificate
# 按照屏幕提示,访问 http://<phabricator server address>/conduit/token/ , 把 token copy/paste 下来
# 在~/.bashrc 里添加下面两行
export EDITOR=vim
alias arc='LC_ALL=C arc'
# 并在命令行执行
source ~/.bashrc
自行处理:https://www.jianshu.com/p/a6ee738da1aa
一般情况下在 HOME 目录下会产生一个 .arcrc
配置文件,格式类似下方:
{
"config": {
"default": "https://<phabricator server address>",
"editor": "vim"
},
"hosts": {
"https://<phabricator server>/api/": {
"token": "cli-rdm2xxxxxxxxxxxx"
}
}
}
可以使用如下命令来更改该配置
arc set-config phabricator.uri "<phabricator server>"
arc set-config editor "vim"
如下:
# 本地开发,新建 feature
arc feature feature_1
# 或 git checkout -b feature_1
# 修改本地文件,然后提交
git add
git commit
# 提交 code review
arc diff
# 通过 --reviewers name 参数可以指定 reviewer
# 这里可以和一个 Task(比如 T123)关联起来,在 Summary 那个域里填上 Ref T123,或者 Fixes T123
# 两者的区别是 Fixes 在代码提交后会自动关闭 Task,Ref 不会
# 也可以提交 code review 之后,在浏览器里操作
# 本地修改后再次提交 code review(这个 revision 是上次创建 code review 时的 id,比如 D1252)
arc diff --update 1252
# --update 1252 也可以不加,默认会合到上一个 review 中
# reviewer 已经 Accept 之后,提交代码(不要用 git push!):
arc land feature_1
# 如果报错找不到对应的 revision,带上 revision 号(比如 1252)运行:
arc land --revision 1252
# land 之后,feature branch 会被自动删除
# land 使用后会将当前分支 merge 或者 squash merge 到 master 分支,提供详细的提交信息,推送到 master 并且删除本地分支
问题: No changes found. (Did you specify the wrong commit range?)
答: Arcanist(arc) 是一个 pre-commit
或者说 pre-push
代码审查工具,一旦本地分支被 push 到 origin,这就打破了 Arcanist 工具的意义,但是可以用以下方法来补救:
git push origin --delete branch_name
arc diff
时告诉分支需要和哪一个分支对比 arc diff origin/master
arc land --onto master
Click 是 Python 下一款命令行库,可以用来快速轻松实现Python命令行程序。之前也介绍过一个 argparse ,但是要比 click 复杂很多,至少从代码上看。但是 click 其实也说了1 argparse 在标准库中,click 是依赖于 optparse 的,至于不基于 argparse 是因为 argparse 不支持嵌套,并且在 POSIX 兼容上有问题。
Click 被设计用来快速构建命令行程序,因此缺乏一些扩展性,比如他不允许高度定制help介绍。Click 是用来支持 Flask 开发框架的。
官网地址: http://click.pocoo.org
# hello.py
import click
@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
help='The person to greet.')
def hello(count, name):
"""Simple program that greets NAME for a total of COUNT times."""
for x in range(count):
click.echo('Hello %s!' % name)
if __name__ == '__main__':
hello()
然后可以这样运行该脚本 python hello.py --count=3
,并且 Click 还会自动生成 help 信息。
Click 使用基本可以归纳为
最基础的用法, option 接受一个变量
@click.command()
@click.option('--n', default=1)
def hello(n):
click.echo('hello' * n)
使用 --n=2
输出两遍
接受多个变量,需要使用 nargs
指定数量
@click.command()
@click.option('--pos', nargs=2, type=float)
def cal(pos):
click.echo('%s / %s' % pos)
使用 --pos 5.0 4.0
如果参数是固定的几个值,可以使用可选项
@click.command()
@click.option('--hash-type', type=click.Choice(['md5', 'sha1']))
def digest(hash_type):
click.echo(hash_type)
使用 --hash-type=md5
参数只能为 md5
或者 sha1
,否则报错。
option 还有其他一些参数,比如 prompt
当用户忘记该参数时,将错误报出来,hide_input
可以隐藏输入,常用于密码输入,confirmation_prompt
验证输入等等。
Click 封装了
@click.password_option()
@click.confirmation_option(prompt='Are you sure you want to drop the db?')
和 Option 一样,Argument 最基础的应用就是传递一个简单变量值
@click.command()
@click.argument('input', type=click.File('rb'))
@click.argument('output', type=click.File('wb'))
def inout(input, output):
while True:
chunk = input.read(1024)
if not chunk:
break
output.write(chunk)
http://click.pocoo.org/6/why/ ↩