gogs的使用

gogs

 

https://gogs.io   # go语言开发的git服务器;

https://www.percona.com/downloads/   #mysql咨询和软件包装,比mysql性能强

 

linux_amd64.tar.gz   #gogs0.11.4

Percona-Server-5.5.45-37.4-r042e02b-el6-x86_64-bundle.tar

 

]# tar xf Percona-Server-5.5.45-37.4-r042e02b-el6-x86_64-bundle.tar

]# tar xf linux_amd64.tar.gz

]# ls

gogs                                                       Percona-Server-devel-55-5.5.45-rel37.4.el6.x86_64.rpm

gogs_0_11_4_linux_amd64.tar.gz                             Percona-Server-server-55-5.5.45-rel37.4.el6.x86_64.rpm

Percona-Server-5.5.45-37.4-r042e02b-el6-x86_64-bundle.tar  Percona-Server-shared-55-5.5.45-rel37.4.el6.x86_64.rpm

Percona-Server-55-debuginfo-5.5.45-rel37.4.el6.x86_64.rpm  Percona-Server-test-55-5.5.45-rel37.4.el6.x86_64.rpm

Percona-Server-client-55-5.5.45-rel37.4.el6.x86_64.rpm

 

]# yum -y install Percona-Server-shared-55-5.5.45-rel37.4.el6.x86_64.rpm Percona-Server-server-55-5.5.45-rel37.4.el6.x86_64.rpm Percona-Server-client-55-5.5.45-rel37.4.el6.x86_64.rpm   #有先后顺序,shared要在前面

 

注:

Error: mysql-server conflicts with Percona-Server-server-55-5.5.45-rel37.4.el6.x86_64

Error: mysql conflicts with Percona-Server-client-55-5.5.45-rel37.4.el6.x86_64

如有以上报错,卸载mysql即可,yum remove mysql-server mysql

 

]# /etc/init.d/mysql start

Starting MySQL (Percona Server)..                          [  OK  ]

]# ss -tanl | grep :3306

LISTEN     0      50                        *:3306                     *:*    

 

]# /usr/bin/mysql_secure_installation

……

 

]# mysql -uroot -p

Enter password:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| log_db             |

| mysql              |

| tarena             |

| web02              |

| web03              |

| web09              |

+--------------------+

7 rows in set (0.04 sec)

 

 

]# useradd git

]# id git

uid=506(git) gid=506(git) groups=506(git)

 

]# tar xf linux_amd64.tar.gz

]# cd gogs

]# vim scripts/mysql.sql   # utf8mb4,该字符集在mysql5.5以下版本不支持

 

]# mysql -uroot -p < scripts/mysql.sql   #必须要在解压的根路径下执行该脚本

]# mysql -uroot -prootqazwsx

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| gogs               |

| log_db             |

| mysql              |

| tarena             |

| web02              |

| web03              |

| web09              |

+--------------------+

8 rows in set (0.00 sec)

 

mysql> GRANT ALL ON gogs.* TO 'gogs'@'%' IDENTIFIED BY 'gogs';

Query OK, 0 rows affected (0.00 sec)

 

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select User,Password,Host from user;

+------+-------------------------------------------+-----------+

| User | Password                                  | Host      |

+------+-------------------------------------------+-----------+

| root | *247FDDD1F94735215EEDBA224C4434C291D64319 | localhost |

| root | *247FDDD1F94735215EEDBA224C4434C291D64319 | 127.0.0.1 |

| gogs | *461C3A96BAEF66E327658B3AFF86F8D71BEE3F99 | %         |

+------+-------------------------------------------+-----------+

3 rows in set (0.00 sec)

 

 

https://gogs.io/docs/advanced/configuration_cheat_sheet.html   #配置文件手册

通用配置:

APP_NAME,应用名称,可改为组织或公司名;

RUN_USER,运行应用的用户名称,建议使用git,如果在个人pc上运行gogs,需改为系统用户名称,如果没有正确设置这个值,可能导致应用崩溃;

 

server服务器配置:

HTTP_ADDR,应用http监听地址;

HTTP_PORT,应用http监听端口;

DOMAIN,服务器域名,会影响ssh clone地址;

ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/,公开的完整url路径;

 

repository仓库:

ROOT,用户仓库存储根目录,必须为绝对路径,默认为~/<user name>/gogs-repositories;

 

database数据库:

DB_TYPE,数据库类型,可以是mysql/postgres/mssql/sqlite3;

HOST,数据库主机地址与端口;

NAME,库名;

 

security安全:

INSTALL_LOCK,用于指示是否允许访问安装页面(该页面可设置管理员账号),非常重要;

SECURITY_KEY,全局的加密密钥,务必修改该值确保服务器安全(会在每次安装时自动生成随机字符串);

 

 

]# mkdir -pv custom/conf/   #默认配置在conf/app.ini,该文件从v0.6.0开始被嵌入到二进制中,在不允许修改默认配置的情况下,只要创建custom/conf/app.ini自定义配置文件就可心

mkdir: created directory `custom'

mkdir: created directory `custom/conf/'

]# vim custom/conf/app.ini

APP_NAME = magedu

RUN_USER = git

RUN_MODE = dev   #dev开发者模式,鉴于性能和其它考虑建议使用prod模式

 

[server]

HTTP_ADDR = 0.0.0.0

HTTP_PORT = 3000

 

[database]

DB_TYPE = mysql

HOST = 127.0.0.1:3306

NAME = gogs

USER = gogs

PASSWORD = gogs

 

[security]

INSTALL_LOCK = false

SECRET_KEY = www.magedu.com.python.git:gogs

 

]# ./gogs web   #普通启动,另守护进程scripts/init/centos/gogs

]# cp -r gogs/ /home/git/

]# cd gogs

]# cp scripts/init/centos/gogs /etc/init.d/

]# chmod +x /etc/init.d/gogs

]# chkconfig --add gogs

]# chkconfig --list gogs

gogs              0:off 1:off 2:on 3:on 4:on 5:on 6:off

]# chown -R git.git /home/git/

]# chown git.git /etc/init.d/gogs

]# /etc/init.d/gogs start   #本例使用此种方式启动,若切为git用户执行报错为Starting Gogs: runuser: cannot set groups: Operation not permitted

 

http://10.113.129.2:3000/install

   1.jpg

数据库用户密码;

2.jpg

域名,10.113.129.2;

应用URL,http://10.113.129.2:3000/;

立即安装;

3.jpg

马上注册,要注册一个用户,注册的第一个用户直接成为管理员账户,ID=1;

4.jpg

jowin,jowin@gogs.com,jowin,创建账户;

注:admin账户不能创建,默认保留;

5.jpg

jowin/jowin,登录;

 

创建第二个账户,chai/chai;

6.jpg

 

mysql> use gogs;

mysql> select id,name,email from user;

+----+-------+----------------+

| id | name  | email          |

+----+-------+----------------+

|  1 | jowin | jowin@gogs.com |

|  2 | chai  | chai@gogs.com  |

+----+-------+----------------+

2 rows in set (0.00 sec)

 

7.jpg

创建新的仓库,可见性(私有),.gitignore,授权许可,创建仓库;

如果要公开,需指明“授权许可”,GPL严苛,宽松的apache、mit等;

 

8.jpg

9.jpg

SSH,私服用;

 

解决gogs打开网页慢:

禁用gravatar服务,使用本地头像;

方式一:

gogs]# vim custom/conf/app.ini

[picture]

DISABLE_GRAVATAR        = true

ENABLE_FEDERATED_AVATAR = true

]# /etc/init.d/gogs restart

Shutting down Gogs:                                        [  OK  ]

Starting Gogs:                                             [  OK  ]

方式二:

在install的安装界面,禁用Gravatar服务;

 

 

 

git

 

由来:

linux内核代码需要版本管理工具维护代码;

2002年开始,使用的是bitMover公司的BitKeeper(商用软件),与linux社区崇尚的自由软件相悖;

2005年,Andrew Trigdgell对BitKeeper的协议进行逆向工程,BitKeeper作者决定收回无偿使用权,磋商无果,linus又找不到合适的版本管理工具,决定自行开发分布式版本管理工具;一个月后,linux内核代码被git接管;

2008年,基于web使用git进行版本控制的软件托管服务的网站github上线;

2016年5月9日,11年后,BitKeeper开源,发布在了github上;

 

]# yum -y install git

]# git --version

git version 1.7.1

 

 

概念:

10.jpg

remote,远程版本库,网络上的另一个版本库,可以和本地库交互;私服;

repository,仓库、版本库,git初始化后,会在当前目录生成一个.git目录,这就是版本库;

workspace,工作空间、工作区,.git所在的目录就是工作区,一般是项目的根目录;写源码的地方,代码的编辑环境,有.git目录;

index,索引,介于工作区和版本库之间,暂存修改的;索引库,待提交,可理解为缓存,临时的区域;

 

remote--pull-->workspace

remote--pull|fetch-->repository

 

pull和push不对应:

pull,远程私服到本地的repository和workspace都有作用;

push,仅本地的repository到远程私服;

 

push和fetch是对应的;

 

 

操作:

]$ git init   #初始化一个版本库,多了.git目录,不要随便动,这个目录一般是项目的根目录,这个路径以后归git管

Initialized empty Git repository in /home/python/magedu/projects/cmdb/.git/

]$ vim index.html

<h1>test</h1>

]$ git add index.html   #添加文件,单个文件添加,这一步是把文件的当前变化增加到索引中,也就是以后这个文件需版本库来跟踪管理,注意这步不是提交,没有添加进来git就不关心,此时文件还可继续修改,还可添加新的被跟踪文件,一定要add才能把这些改变加入到索引中

]$ git add .   #添加文件,批量添加,点表示当前目录

]$ git status   #查看状态,Untracked file列出未跟踪的文件

# On branch master

#

# Initial commit

#

# Changes to be committed:

#   (use "git rm --cached <file>..." to unstage)

……

 

file status lifecycle:

11.jpg

 

git的文件分类:

tracked,追踪的,已经加入版本库的文件;

untracked,未追踪的,未加入到版本库的文件;

ignored,忽略的,git不再关注的文件,如一些临时文件;.gitignore文件中,目录以/结尾,行起始的!是取反;

 

py的忽略文件模板:

https://github.com/github/gitignore/blob/master/Python.gitignore

其它语言的忽略文件模板:

https://github.com/github/gitignore/

 

]$ vim .gitignore

*.ipynb   #notebook

__pycache__/

.*   #点开头的文件

 

]$ vim index.html

<h1>test duplicate</h1>

]$ git status

……

# Changed but not updated:

#   (use "git add <file>..." to update what will be committed)

#   (use "git checkout -- <file>..." to discard changes in working directory)

#

#       modified:   index.html

]$ git add .

]$ git commit -m 'first commit'   #提交代码,-m <msg>填写本次日志消息,必须写,写的明明白白清清楚楚,可中文,工作中程序员应该对每一次提交写明做了什么改动

[master (root-commit) 3ff2c45] first commit

 134 files changed, 5131 insertions(+), 0 deletions(-)

……

]$ git status   #自最近commit成功后无变化

# On branch master

nothing to commit (working directory clean)

 

git的提交,分两步:

暂存变更,add作用是把新文件或文件新的改动添加到一个暂存区stage(index),即加入到index中;

提交变更,commit提交的是暂存区的改动,而不是物理文件目前的改动(workspace中的文件更改),提交到当前分支,默认是master分支

$ git commit index.html -m 'second commit'   #两步合一步,$git commit -a -m '...',-a,--all,把所有追踪的文件的改动自动暂存再commit

注:

此处两步提交与分布式的两阶段提交不同;

 

]$ vim example.html

<h1>example</h1>

]$ git commit --amend   #增补,如第一次提交后,忘记加入1个文件,将此次改动提交到上一次(第1次提交的)状态

[master 8c9565b] first commit

 135 files changed, 5132 insertions(+), 0 deletions(-)

……

 

]$ git log   #每一次commit都有一个ID与之绑定,不重复的ID

commit 8c9565b77da25c4be6c9b9fdbc2f13a93897d007

Author: chaizaowen <chaizaowen@ane56.com>

Date:   Fri Jul 13 15:23:52 2018 +0800

 

    first commit

]$ git log 8c9565b   #7位ID即可,若前7位区分不出可多几位

commit 8c9565b77da25c4be6c9b9fdbc2f13a93897d007

Author: chaizaowen <chaizaowen@ane56.com>

Date:   Fri Jul 13 15:23:52 2018 +0800

 

    first commit

]$ git log HEAD   #HEAD类似指针,指代当前分支最后一次commit;HEAD^指代上一次提交;HEAD^^指代上上一次提交;HEAD~n上n次提交

commit 8c9565b77da25c4be6c9b9fdbc2f13a93897d007

Author: chaizaowen <chaizaowen@ane56.com>

Date:   Fri Jul 13 15:23:52 2018 +0800

 

    first commit

 

]$ vim example.html

<h1>example duplicate</h1>

]$ git diff   #查看各种差异

diff --git a/example.html b/example.html

index 57b8eef..70946fa 100644

--- a/example.html

+++ b/example.html

@@ -1 +1 @@

-<h1>example</h1>

+<h1>example duplicate</h1>

]$ git add example.html

]$ git diff --cached

diff --git a/example.html b/example.html

index 57b8eef..70946fa 100644

--- a/example.html

+++ b/example.html

@@ -1 +1 @@

-<h1>example</h1>

+<h1>example duplicate</h1>

 

注:

HEAD类似指针,指代当前分支最后一次commit;

HEAD^指代上一次提交;

HEAD^^指代上上一次提交;

HEAD~n上n次提交

 

查看各种差异:

#git diff   #查看被跟踪文件未暂存的修改,比较暂存区和工作区;

#git diff --cached   #查看被跟踪文件暂存的修改,比较暂存区和上一次commit的差异;

#git diff HEAD   #查看被跟踪文件,比较工作区和上一次commit的差异,HEAD指代最后一次commit;

 

检出和重置:

#git checkout   #列出暂存区可被检出的文件;

#git checkout file   #从暂存区检出文件到工作区,就是覆盖工作区文件,可指代检出的文件,但不清除stage;用于在workspace中改的不好,把暂存区的文件覆盖到工作区重新编辑;

#git checkout commit file   #检出某个commit的指定文件到暂存区和工作区;

#git checkout .   #检出暂存区的所有文件到工作区;

#git reset   #列出将被reset的文件;

#git reset file   #重置文件的暂存区,和上一次commit一致,工作区不影响;

#git reset --hard   #硬重置,重置暂存区和工作区,与上一次commit保持一致,谨慎使用;

 

注:

checkout关注的是workspace,从暂存区(index)或版本库(repository,commit)到workspace;

 

#git reflog   #显示commit的信息,只要HEAD发生变化,就可在这里看到;

#git reset commit   #重置当前分支的HEAD为指定commit,同时重置暂存区,但工作区不变;

#git reset --hard [commit]   #重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致;

#git reset --keep [commit]   #重置当前HEAD为指定commit,但保持暂存区和工作区不变,HEAD指针在动;

 

移动和删除:

#git mv src dst   #改名,直接把改名的改动放入暂存区;

#git rm file   #会同时在版本库和工作区中删除文件,真删除,谨慎操作;

#git rm --cached file   #将文件从暂存转成未暂存,从版本库中删除,但不删除工作目录的该文件,即文件恢复成不追踪的状态;

注:以上都算是改动,必须commit才算真改动;

 

 

push到服务器:

 

用http协议push到远程:

]$ git config --global user.name 'chai'   #生成用户级别的文件~/.gitconfig

]$ git config --global user.email 'chaizaowen@ane56.com'

]$ cat ~/.gitconfig   #配置此文件是个好的习惯

[user]

        name = chai

        email = chaizaowen@ane56.com

[color]

        ui = true

[http]

        postBuffer = 524288000

 

]$ git remote add origin http://chai@10.113.129.2:3000/chai/cmdb.git   #远程版本库名origin,这是个习惯用法,将建立origin和后面url的映射,这些信息保存在.git/config文件的[remote "origin"]段中,.git/config是版本库级别配置文件,这里的设置具有最高优先级;origin名字可改,一般不改,约定是这个名字

]$ cat .git/config

[core]

        repositoryformatversion = 0

        filemode = true

        bare = false

        logallrefupdates = true

[remote "origin"]

        url = http://chai@10.113.129.2:3000/chai/cmdb.git

        fetch = +refs/heads/*:refs/remotes/origin/*

 

]$ git push -u origin master   #此步会有输入密码的对话框,使用http得有账号密码,第一次远程推送时加-u,update,可将很多信息更新上去,之后再提交就不加-u,直接$git push origin master甚至$git push即可

Counting objects: 149, done.

Delta compression using up to 8 threads.

Compressing objects: 100% (128/128), done.

Writing objects: 100% (149/149), 46.05 KiB, done.

Total 149 (delta 7), reused 0 (delta 0)

To http://chai@10.113.129.2:3000/chai/cmdb.git

 * [new branch]      master -> master

Branch master set up to track remote branch master from origin.

 

注:

$git push -u origin master有如下报错

No protocol specified

(gnome-ssh-askpass:3373): Gtk-WARNING **: cannot open display: :1.0

切至root下执行#xhost +,授予其他用户访问当前屏幕的权限,即可打开输入密码的对话框;

 

]$ vim about.html

]$ git add about.html

]$ git commit -m 'add about.html'

[master 43f8e47] add about.html

 1 files changed, 1 insertions(+), 0 deletions(-)

 create mode 100644 about.html

]$ git push   #需输密码

Counting objects: 4, done.

Delta compression using up to 8 threads.

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 276 bytes, done.

Total 3 (delta 1), reused 0 (delta 0)

To http://chai@10.113.129.2:3000/chai/cmdb.git

   d973a21..43f8e47  master -> master

12.jpg

 

13.jpg

仓库设置,“该仓库为私有的”前勾去掉,更新设置,再次web页面打开,刷新;

私有的仓库,必须登录,只能用户自己看,为了方便,修改为公有的;

 

14.jpg

点ID号,可看出改了哪些内容;

 

 

用ssh协议push到远程:

这个操作实在window中的任意想要clone到的一个文件,右键单击git Bash Here,然后再输入的命令

]$ cd

]$ ssh-keygen -t rsa -C 'chai@ane56.com'   #如果在win下,用gitbash,原命令行没有ssh-keygen命令

]$ cat .ssh/id_rsa.pub   #将此内容放至gogs web页的“增加SSH密钥”

 

15.jpg

用户设置,SSH密钥,增加密钥;

 

]$ pwd

/home/python

]$ mkdir my_gogs

]$ git clone git@10.113.129.2:chai/cmdb.git

Initialized empty Git repository in /home/python/my_gogs/cmdb/.git/

The authenticity of host '10.113.129.2 (10.113.129.2)' can't be established.

RSA key fingerprint is 5c:a7:44:96:bc:20:5a:dc:51:62:76:9b:42:1c:8b:c0.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '10.113.129.2' (RSA) to the list of known hosts.

remote: Counting objects: 152, done.

remote: Compressing objects: 100% (123/123), done.

remote: Total 152 (delta 8), reused 148 (delta 7)

Receiving objects: 100% (152/152), 46.27 KiB, done.

Resolving deltas: 100% (8/8), done.

[python@tmsapp my_gogs]$ ll -h

total 4.0K

drwxr-xr-x 10 python python 4.0K Jul 13 17:27 cmdb

 

 

 

pycharm中用git:

 

在win上做好SSH;

gogs上SSH密钥,粘贴id_rsa.pub里内容;

16.jpg

 

File-->Close Project-->Checkout from Version Control,选Git;

17.jpg

Git Repository URL,Parent Directory,Directory Name,Test,Clone;

18.jpg

New-->Python File,app.py,Yes,编辑该文件;

19.jpg

20.jpg

VCS-->Git-->Add,同gitbash里$git add app.py;

21.jpg

VCS-->Commit

22.jpg

23.jpg

VCS-->Git-->Push-->Push;

24.jpg

25.jpg

私服查看;

26.jpg

 

 

 

stash存储:

#git stash   #暂时存储最后一次提交后的变化,放到栈中;

#git stash list

#git stash pop   #从栈中取出刚才保存的变化,并合并;

 

应用场景:

开发中,当前手中的工作没有完成,需要中断当前工作来完成其它请求,如修复bug,已完成的工作内容提交不合适,可能还需要大的调整,但是紧急请求又不能不做,就需要stash存储未完成的工作(上次提交后做的修改);

 

例(在pycharm中操作):

当前正在写dispatcher.py,发现之前提交的app.py有问题,当前正在开发的半成品如何处理?用stash;

27.jpg

VCS-->Git-->Stash Changes,Message(edit dispatcher)-->Create Stash,执行后,工作区回到了上次提交的样子; 

28.jpg

29.jpg

 

 

 

 

修改app.py,提交

30.jpg

31.jpg

 

VCS-->Git-->UnStash Changes-->Apply Stash

32.jpg

33.jpg

 

例(命令行下操作):

34.jpg

35.jpg

 

 

 

branch分支:

多人协作一起开发,开发项目中不同的独立的功能,这些功能可能需要好几天才能完成,又或者定制版本,往往需要一个不同的定制需求;

 

代码中至少有一个分支,称主干分支或主分支master,默认都在主分支上开发;

36.jpg

图中圆圈,即节点,表示每一次提交;

 

项目往往是并行多人开发的,都在主分支上克隆,然后修改提交,那么主分支就会存在大量的冲突,甚至有一些不完善代码提交,主分支就乱如麻,不可维护了;

再次,如果一次提交后,需要发布一个版本,这个版本以后独立维护、开发,而主分支还需要继续发展,怎么办?引入分支;

 

分支名:

在版本库中必须唯一;

不能以-开头;

可用/开头,但不能以/结尾,被它分割的名称不能以.开头;

不能使用两个连续的.,如..;

不能包含任何空白字符,git的特殊符号;

 

37.jpg

 

38.jpg

 

创建分支:

需要指明从什么分支上创建什么名字的分支;

39.jpg

上图,均在master分支上,三种颜色重叠表示与私服同步且在主分支上;

 

Version Control-->右键某一次的commit-->New Branch,New Branch name(dev),勾选Checkout branch(检出分支就立即切换到dev分支);

40.jpg

41.jpg

 

修改app.py,commit and push

42.jpg

43.jpg

在私服上查看;

44.jpg

 

dev开发完成,需将功能合并到master,切换回到master,检出master;

Version Control-->右键最近一次的master上的提交(origin&master)-->Branch 'master'-->Checkout

45.jpg

VCS-->git-->Merge Changes,Branches to merge中选dev,Strategy中选No fast forward-->Merge

46.jpg

47.jpg

48.jpg

目前的合并,只是本地,再push到私服

49.jpg

 

50.jpg

 

fast forward、no fast forward:

51.jpg

ff,默认,合并后为一条线;

no fast forward,有交叉;

 

 

 

gitflow工作流:

不同公司,不同的项目规模,不同的管理水平有着不同git工作流方式;

最佳实践,使用git一般至少2个分支,master和develop;

master,生产环境都来主干分支上拿数据部署,也可以使用钩子自动完成;

develop,开发分支,开发人员都是检出这个分支开发;

 

 

 

win下Git GUI

52.jpg

 

 

 

注意:

函数不可以分前后,一般一个类交给某个人开发,除非这个类很大,由不同的人开发不同的方法;

最多的是模块化开发;

要有设计文档,如不同功能的类不可以同名;

大的项目最多拉3、4条分支;不建议拉多个分支;真正在开发时一般两条线,master&dev;

拉分支应由具有相应权限的人开;

开发人员都从dev分支上拉取,不能在master上拉取;达到某个里程碑再合并到master上;

master分支用于运维人员发布拉取;

commit时要保证是有效代码,不可以在分支上reset等回退之类的操作;

要会拉分支-->合并-->commit&push;

刚开始开发时要clone,clone会把.git目录带回来;不可以初始化,如果重新git init,git log中没内容;

 

 ©著作权归作者所有:来自51CTO博客作者chaijowin的原创作品,如需转载,请注明出处,否则将追究法律责任

posted @ 2020-03-23 23:16  二十四长夜明  阅读(1678)  评论(0编辑  收藏  举报