根据搜集的资料安装测试并在安装测试过程中整理的文档,如有不足希望不吝赐教。
本文介绍CentOS7中hyperledger-fabric1.1多机部署使用kafka共识非docker方式,大体上与之前solo共识的步骤类似,(solo共识:《CentOS7中hyperledger-fabric1.1 - 1+4多机安装部署及部分异常处理(solo共识,手动非docker方式)》)只是在其基础上将网络结构部署为2orderer+6peer结构,修改默认的solo共识为kafka共识,添加了使用configtxlator工具对区块信息查询,并且对部分不合理或冗余位置做了修改。kafka与zookeeper安装可以参考《CentOS7安装zookeeper》《CentOS7安装kafka》或者自行搜索安装方式。
目录
Fabric相关组件以及工具介绍:
- orderer 共识节点。为交易排序,并生成区块
- peer共识节点。为交易背书,并记录区块信息
- crypto用于生成区块链网络中相应用户的相关证书文件
- configtxgen 用于生成区块链系统链码的创世区块、新建通道的配置文件、以及组织中锚节点的配置文件
本次Fabric区块链网络部署环境:8台 Centos 7系统的虚拟机。
其中golang、docker、内核升级等安装配置全部是使用单机测试(https://blog.csdn.net/qq_38591756/article/details/82826979)的配置,相关的安装配置步骤可以参考下面给出的链接或者自行搜索相关安装配置资料。
相关环境版本如下:
golang:【go version】《CentOS7安装golang》
go version go1.10.2 linux/amd64
docker:【docker --version】《CentOS7 - Docker&Docker-Compose安装》
Docker version 18.03.1-ce, build 9ee9f40
docker-compose:【docker-compose --version】《CentOS7 - Docker&Docker-Compose安装》
docker-compose version 1.21.2, build a133471
linux:【rpm -q centos-release】
centos-release-7-5.1804.el7.centos.2.x86_64
linux内核:【uname -a】《CentOS7修改内核版本》
Linux localhost.localdomain 4.16.13-1.el7.elrepo.x86_64 #1 SMP Wed May 30 14:31:51 EDT 2018 x86_64 x86_64 x86_64 GNU/Linux
2个 orderer 节点,6个 peer 节点,使用 kafka共识算法
172.17.3.207,208,209,211,212,213部署peer节点
172.17.3.205,206部署orderer节点
单机部署测试时,go、docker、docker-compose、git等应该已经安装完成并且已经完成环境变量等配置,fabric源码已经下载,此处不再赘述。如果后面步骤碰到未安装的依赖等可自行安装后继续。
注意:以下环境构建需要在每台机器上完成。
安装编译相关的依赖包 snappy-devel.x86_64、zlib-devel.x86_64、bzip2-devel.x86_64、libtoo-ltdl-devel.x86_64、libtool
可以使用命令直接安装,命令如下:
yum -y install snappy-devel.x86_64 zlib-devel.x86_64 bzip2-devel.x86_64 libtoo-ltdl-devel.x86_64 libtool
从 github.com 上下载 go 语言编译相关环境 gotools(golang.org 需要翻墙,所以从 github 上获取)
在目录$GOPATH/src/golang.org/x/下执行:
git clone https://github.com/golang/tools.git
切换到 fabric 源码的目录下面,通过 makefile 文件,可以编译出 fabric 项目的全部可执行文件。
这次的演示例子中,只需要编译部分必要文件即可:orderer、peer、configtxgen、cryptogen。
注:以下命令,全部在$GOPATH/src/github.com/hyperledger/fabric 目录下执行。
cp -r $GOPATH/src/golang.org/x/tools/ $GOPATH/src/github.com/hyperledger/fabric/gotools/build/gopath/src
完成后执行:
make gotools
在执行make命令时可能会遇到的异常信息(一):
can't load package: package golang.org/x/lint/golint: no Go files in /opt/gopath/src/github.com/hyperledger/fabric/gotools/build/gopath/src/golang.org/x/lint/golint
或
package golang.org/x/tools/go/ast/astutil: unrecognized import path "golang.org/x/tools/go/ast/astutil" (https fetch: Get https://golang.org/x/tools/go/ast/astutil?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
或
package golang.org/x/tools/go/gcexportdata: unrecognized import path "golang.org/x/tools/go/gcexportdata" (https fetch: Get https://golang.org/x/tools/go/gcexportdata?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
例如:
解决办法:
下载安装golang.org/x/net、golint
cd $GOPATH/src/golang.org/x/ git clone https://github.com/golang/net.git net git clone https://github.com/golang/tools.git git clone https://github.com/golang/lint.git go install net go get golang.org/x/lint/golint
然后执行如下命令,如果出现没有文件夹的异常,根据命令在相应位置创建即可。
在执行make命令时异常信息(二):
解决办法:
重试或者手动执行报错的git命令(如下)再重试。
git clone https://github.com/kardianos/govendor /opt/gopath/src/github.com/hyperledger/fabric/gotools/build/gopath/src/github.com/kardianos/govendor
成功后类似如下截图:
make buildenv
在执行make命令时可能会遇到的异常信息(一):
[root@localhost fabric]# make buildenv
(cd build/docker/gotools/bin && tar -jc *) > build/gotools.tar.bz2
tar: *: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
make: *** [build/gotools.tar.bz2] Error 2
或
[root@localhost fabric]# make buildenv
mkdir -p build/image/buildenv/payload
cp build/gotools.tar.bz2 build/docker/gotools/bin/protoc-gen-go build/image/buildenv/payload
cp: cannot stat ‘build/docker/gotools/bin/protoc-gen-go’: No such file or directory
make: *** [build/image/buildenv/payload] Error 1
解决办法:
在出现错误1、2,3(截图中标注)时重试,每次错误不同,当出现第三次报错,如图,进行如下操作:
执行命令:
go get -u github.com/golang/protobuf/protoc-gen-go
执行完成后可以在$GOPATH/bin/路径下看到protoc-gen-go文件,然后再执行命令:
cp /opt/gopath/bin/protoc-gen-go /opt/gopath/src/github.com/hyperledger/fabric/build/docker/gotools/bin/
针对上述异常,将其拷贝至指定目录,再次执行make buildenv,成功截图如下:
分别执行下面四条命令:
make orderer
make peer
make configtxgen
make cryptogen
编译的可执行程序生成在./fabric/build/bin目录下,设置该目录至 PATH环境变量。可以修改/etc/profile文件,在PATH后追加:
:/opt/gopath/src/github.com/hyperledger/fabric/build/bin 注意前面的冒号
在执行make命令时可能会遇到的异常信息(一):
vendor/github.com/miekg/pkcs11/pkcs11.go:26:18: fatal error: ltdl.h: No such file or directory
#include <ltdl.h>
解决办法:
安装ltdl,命令如下:
yum -y install libtool-ltdl-devel
安装完成后重试即可。
在执行make peer命令时可能会遇到的异常信息:
curl: (6) Could not resolve host: services.gradle.org
The command '/bin/sh -c curl -sSL https://services.gradle.org/distributions/gradle-2.12-bin.zip > /tmp/gradle-2.12-bin.zip' returned a non-zero code: 6
make: *** [build/image/javaenv/.dummy-x86_64-1.1.1-snapshot-ff5e861] Error 6
解决办法:
根据网上查找的资料,需要修改dns,但是本次问题并没有解决,而是重启docker。以下为两种方法,请自行测试。
1)修改DNS:
修改/etc/NetworkManager/NetworkManager.conf文件,在main部分添加 “dns=none” 选项,如图:
然后重新装载上面修改的配置:
systemctl restart NetworkManager.service
再修改/etc/resolv.conf文件,将dns改为114.114.114.114以及8.8.8.8,
2)重启docker:
本次使用上面方法没有解决,最后使用重启docker的方法解决,重启命令:
service docker restart
编译成功截图:
再次提示:以上环境需要在每台机器上构建完成。
注意:以下步骤执行之前需要做一些检查:
- 检查orderer节点上7050端口是否开放、4个peer节点的7051、7052、7053端口是否打开。然后用telnet(telnet IP port)命令或其他方法检查端口是否可以访问(可能需要安装telnet)。或者直接关闭所有防火墙。
- 如果之前执行过操作,没有成功而回头重复以下步骤(尤其重新生成证书、重启orderer、peer节点等操作),需要删除所有机器上/var/hyperledger目录下所有文件。本路径在配置文件orderer节点上的orderer.yaml(FileLedger标签下Location值)、peer节点上core.yaml(fileSystemPath值)中。否则在两个peer从节点以及在执行某些操作时会提示包含“X509”的错误。
- 因为用到了kafka集群,因此与Ⅱ类似的,如果已经执行了“orderer start“命令,在回头重复执行的时候需要删除fabric在kafka中创建的topic,具体删除方法请自行搜索或者参考《centos7安装kafka》。
- 检查所有机器的时区时间是否一致,如果不一致在后面启动等步骤会有类似类似超时或者过期的异常。查看时区及同步网络时间方法请自行搜索。
基本环境已经完成,下面将使用编译出来的可执行程序及相关工具,来搭建一个 fabric 区块链网络,并实现链码的部署以及测试。
首先,分别在五台虚拟机中创建目录/etc/hyperledger/fabric,以下的命令 全部在该目录下执行,并且需要设置 fabric 网络执行的环境变量:
FABRIC_CFG_PATH=/etc/hyperledger/fabric
可以直接在/etc/profile中添加,如图:
通过配置文件 crypto-config.yaml配置fabric 网络用户拓扑关系。crypto-config.yaml 内容如下(crypto-config.yaml文件可以从e2e目录复制一份文件到当前目录):
OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer0
- Hostname: orderer1
PeerOrgs:
- Name: Org1
Domain: org1.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
Specs:
- Hostname: peer0
- Hostname: peer1
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
Specs:
- Hostname: peer0
- Hostname: peer1
- Name: Org3
Domain: org3.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
Specs:
- Hostname: peer0
- Hostname: peer1
如果设置了EnableNodeOUs,就在msp下生成config.yaml文件。
该配置文件,包含一个 orderer 节点,以及两个 peer组织,两个 peer 组织又分别包含了两个 peer 节点。
使用 cryptogen 工具,从crypto-config.yaml配置文件中生成用户相应的秘钥和证书文件 命令如下:
cryptogen generate --config=./crypto-config.yaml --output ./crypto-config
成功后截图如下:
执行命令后,会在当前目录下生成文件夹 crypto-config,包含节点用户的秘钥以及证书文件,如图:
通过scp命令分发 crypto-config文件夹,至其他7台虚拟机的/etc/hyperledger/fabric 目录下(以下为例,根据实际修改主机ip):
scp -r crypto-config root@172.17.0.206:/etc/hyperledger/fabric/
通过配置文件 configtx.yaml 配置ordere 节点启动需要的创始区块信息,以及新建应用通道的交易信息。最初记录时使用的是word,配置文件内容太长,因此没有全部记录,以下截图仅为部分,完整配置文件统一放在附件(CentOS7 - hyperledger fabric1.1 - 1+4多机部署(kafka共识)配置文件)中,请自取,如果积分不足请留言。
修改完成后执行下面命令:
使用工具configtxgen生成 orderer 节点启动所需的创世区块:
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock genesis.block
使用工具 configtxgen生成创建应用通道的交易配置文件:
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx testchannel.tx -channelID testchannel
使用工具 configtxgen 生成更新组织锚节点的配置信息文件:
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./Org1MSPanchors.tx -channelID testchannel -asOrg Org1MSP
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./Org2MSPanchors.tx -channelID testchannel -asOrg Org2MSP
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./Org3MSPanchors.tx -channelID testchannel -asOrg Org3MSP
执行命令后,在当前目录下会生成如下文件:
genesis.block、testchannel.tx、Org1MSPanchors.tx、Org2MSPanchors.tx、Org3MSPanchors.tx
通过 scp 命令发送genesis.block文件至172.17.3.206
通过 scp 命令发送Org1MSPanchors.tx文件至172.17.3.207
通过 scp 命令发送Org2MSPanchors.tx文件至172.17.3.209
通过 scp 命令发送Org3MSPanchors.tx文件至172.17.3.212
通过 scp 命令发送 testchannel.tx文件至全部六台peer主机
由于 fabric 网络启动相关的配置文件中,与网络地址相关的信息都是填写的域名,所以需要在 hosts 文件中配置域名与 ip 的对应关系, orderer 节点和其他的4个 peer 节点的虚拟机都需要配置相关的 hosts 信息:vim /etc/hosts
172.17.3.205 orderer0.example.com
172.17.3.206 orderer1.example.com
172.17.3.207 peer0.org1.example.com
172.17.3.208 peer1.org1.example.com
172.17.1.136 peer0.org2.example.com
172.17.3.211 peer1.org2.example.com
172.17.3.212 peer0.org3.example.com
172.17.3.213 peer1.org3.example.com
其中域名是根据 cryprto-config.yaml 的配置信息得来。
在orderer节点的虚拟机配置orderer节点启动相关配置信息 orderer.yaml,并保存在/etc/hyperledger/fabric目录下。需要注意的是:在orderer.yaml配置文件kafka配置标签中,最后有一个Version参数项,默认为空,默认的版本为0.10.2.0,因为本次安装kafka版本为2.1.1-1.1.0,因此需要修改此处的配置参数为实际安装的版本号:1.1.0。
相关配置文件内容见附件,因为文件不能重名并且为了区分,orderer和peer配置文件后面都加了数字编号以区分,实际使用时要去掉文件名后面的数字编号。
从 cypto-config 文件夹下,拷贝 orderer 节点的秘钥以及证书文件至 fabric 启动环境变量目录下(两个orderer节点都需要执行,操作步骤类似):
cp -r ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp ./
cp -r ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls ./
根据前文的操作,fabric 网络 orderer 节点的执行环境目录下应该有以下文件及文件夹:
./crypto-config、./msp、./tls、orderer.yaml、genesis.block
启动 orderer 节点:
orderer start
上面配置文件中,日志级别为debug(可以根据自己实际情况修改),因此orderer节点启动之后会在控制台看到相关可以看到与kafka相关的日志输出,
在 peer 节点的虚拟机配置 peer 节点启动相关配置信息 core.yaml,并保存在/etc/hyperledger/fabric 目录下。相关配置文件内容见附件。
从 crypto-config 文件夹下,拷贝 peer 节点的秘钥以及证书文件至 fabric 启动环境变量目录下:
cp -r ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp ./
cp -r ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls ./
注意标记部分应该在对应的目录下拷贝对应的文件信息(可以参考 hosts 配置信息的内容和本机ip区分)
根据前文的操作,fabric 网络 peer 节点的执行环境目录下必须有以下文件及文件夹:
/crypto-config.tx、./msp、./tls、testchannel.tx、core.yaml、
Org1MSPanchors.tx(.3.207虚拟机)、
Org2MSPanchors.tx(.3.209虚拟机)、
Org3MSPanchors.tx(.3.212虚拟机)、
启动 peer 节点:
peer node start
注意,拷贝 msp、tls 文件夹的动作可以不需要操作,只需要在对应的 orderer.yaml 以及 core.yaml 配置文件中设置相应的路径即可,这里为了能够与附件中的配置信息一致,故把相应的秘钥与证书文件拷贝至fabric 网络执行环境变量的目录下
设置相应环境变量,6台peer节点都需要设置(根据相应环境修改配置中相应的位置,后面测试连码时也会用到,因此可以直接修改/etc/profile文件,在后面使用时可以不用重复设置)
CORE_PEER_LOCALMSPID=Org1MSP
CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
例如:
执行命令创建应用通道(在peer0org1上执行即可):
peer channel create -o orderer0.example.com:7050 -c testchannel -f ./testchannel.tx --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -t 3000
命令执行成功以后,会在当前目录下生成 应用通道的创世区块testchannel.block 文件,只有使用该文件,才可以加入对应的应用通道。
【注意】最后-t命令可以指定通道创建的超时时间,debug下如果不指定一个较大的超时时间,很大程度上会因为超时创建失败。
【注意】以上命令需要根据实际环境修改,比如orderer0.example.com:7050,如果与实际配置不一致(假如实际中为orderera,但命令使用orderer0)会出现“context deadline exceeded” 异常。
使用 scp命令分发至其他5台 peer 节点虚拟机的 fabric 网络执行环境变量下(/etc/hyperledger/fabric)。以下为例:
scp -r testchannel.block root@172.17.0.208:/etc/hyperledger/fabric/
执行命令加入应用通道(6台peer节点都可以执行一遍):
peer channel join -b testchannel.block
加入应用通道的peer 节点虚拟机都可以通过终端命令查看加入的通过信息,如图,如果所有peer节点都执行了加入命令,都可以看到如下类似信息:
peer channel list
执行命令更新负责代表组织与其他节点通信的锚节点(每个组织只需要在一台(peer0org1/peer0org2/peer0org3)上执行即可)。每个组织指定一个anchor peer,anchor peer是组织用来接收orderer下发的区块的peer。以org1为例:
peer channel update -o orderer0.example.com:7050 -c testchannel -f ./Org1MSPanchors.tx --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
锚节点负责代表组织与其他组织中的节点进行 Gossip 通信。
设置相应环境变量(根据相应环境修改配置):
如果在四.6步骤中已经修改过配置文件(/etc/profile),则此处不需要重复操作。
打包链码,由于这次的例子是基于 go 语言开发的智能合约,会依赖 go 的开发环境进行安装,如果使用 peer chaincode install 命令指定链码路径安装,可能会造成其他虚拟上安装的同样的链码无法同步实例化(go 开发环境不一致引起的问题),所以这里使用 go chaincode package 打包链码,然后通过安装打包链码文件进行链码的安装。
注意:如果是自定义的源码,最好在打包前在源码目录执行一次go build以检查代码是否有错误。
注意:这里进行测试的链码是 fabric 源码中的样例-p 指定的路径在命令执行的时候会自动根据 GOPATH 环境变量自动补全前缀,所以路径一个在 $GOPATH/src/目录下:
peer chaincode package -n test -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -v 1.0 test.pak
使用 scp 命令分发 test.pak 文件至其他5台 peer 节点虚拟机的 fabric 网络执行环境变量路径下。例如:
scp -r test.pak root@172.17.0.208:/etc/hyperledger/fabric/
安装链码
peer chaincode install test.pak
安装链码的 peer 节点服务器可以通过终端命令查看已安装的链码信息,如图:
peer chaincode -C testchannel list --installed
初始化链码,只需要在一台 peer 节点的服务器上执行实例化后自动创建链码容器,其他 peer 节点服务器会同步该实例化的链码信息,并创建链码容器(需要启动docker容器:service docker start)
peer chaincode instantiate -o orderer0.example.com:7050 -C testchannel -n test -v 1.0 -c'{"Args":["init","a","1000","b","2000"]}' -P "OR ('Org1MSP.member','Org2MSP.member','Org3MSP.member')" --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
命令执行后对交易用户 a赋值100,交易用户 b 赋值200代币。
-P指定的参数OR ('Org1MSP.member','Org2MSP.member','Org3MSP.member')是CLI endorsement policy语法,其作用是设置背书策略,表示需要请求三个组织的任何一个签名即可,类似的,如果设置AND ('Org1MSP.member','Org2MSP.member','Org3MSP.member')则表示需要三个组织签名,如果设置OR ('Org1MSP.member',AND('Org2MSP.member','Org3MSP.member'))则表示需要组织一或者组织二和三的签名。
使用命令查看链码容器信息:docker ps。如图:
使用命令:
peer chaincode query -n test -C testchannel -c'{"Args":["query","a"]}'
查看用户a(b)初始值:
执行命令发送一笔交易,命令 b 向 a 转账 40个代币:
peer chaincode invoke -o orderer0.example.com:7050 -C testchannel -n test -c'{"Args":["invoke","b","a","40"]}' --tls ture --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
再次查询a、b余额命令与五.2查询命令相同:
查询转账命令可以在任意peer节点执行,上面查询在.3.207节点(日志级别debug),其他节点类似。
在peer节点执行,以下以207为例。
需要使用configtxlator工具,参考《使用一个简单工具向现有的 Hyperledger Fabric 区块链网络添加一个组织》,简介如下:
configtxlator 工具提供了一个与 SDK 独立的真正无状态的 REST API,以简化 Hyperledger Fabric 区块链网络中的配置任务。该工具能够在不同的等效数据表示/格式之间轻松转换。例如,在工具操作的一种模式中,该工具在二进制 protobuf 格式与人类可读的 JSON 文本格式间来回转换。此外,该工具可以基于两组不同的配置交易之间的区别来计算配置更新。
确保您至少安装了 Hyperledger Fabric 的 1.1.0 预览版,命令行输入如下命令:
peer --version
本文使用开源的 jq 工具来通过脚本处理与 configtxlator 返回的 JSON 的交互。这些 JSON 操作也可以手动或通过其他 JSON 工具执行。centos使用如下命令安装jq工具:
安装源:
yum install epel-release
查看jq列表:
yum list jq
执行安装:
yun install jq
验证:
后台启动 configtxlator工具:
要启动configtxlator首先要编译configtxlator可执行程序,编译方法类似第三部分:
首先进入$GOPATH/src/github.com/hyperledger/fabric目录:
cd $GOPATH/src/github.com/hyperledger/fabric
然后执行编译命令:
make configtxlator
如下:
使用如下命令在后台启动configtxlator:
configtxlator start &
验证(查看)configtxlator是否启动:
netstat -lnp | grep 7059
切换目录到/etc/hyperledger/fabric
cd /etc/hyperledger/fabric
执行以下命令检索应用通道testchannel上最新的区块,因为订购者端点受 TLS 保护,所以以参数形式提供证书颁发机构身份。
peer channel fetch newest newest_block.pb -c testchannel -o orderer0.example.com:7050 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pen
可以看到目前最新的区块高度为229。
也可以指定区块高度,只需要修改命令中fetch后的参数即可,以区块高度228为例如下:
peer channel fetch 228 228_block.pb -c testchannel -o orderer0.example.com:7050 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
命令执行完成后可以在当前文件夹看到newest_block.pb(228_block.pb)文件。
以newest_block.pb为例:
curl -X POST --data-binary @newest_block.pb http://127.0.0.1:7059/protolator/decode/common.Block > newest_block.json
完成后会在当前目录看到生成的newest_block.json文件,即可使用其他编辑软件打开查看。
git branch -a
*表示当前使用分支
如果上面命令不加参数(git branch),则为查看本地的git分支
END