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
数据库用户密码;
域名,10.113.129.2;
应用URL,http://10.113.129.2:3000/;
立即安装;
马上注册,要注册一个用户,注册的第一个用户直接成为管理员账户,ID=1;
jowin,jowin@gogs.com,jowin,创建账户;
注:admin账户不能创建,默认保留;
jowin/jowin,登录;
创建第二个账户,chai/chai;
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)
创建新的仓库,可见性(私有),.gitignore,授权许可,创建仓库;
如果要公开,需指明“授权许可”,GPL严苛,宽松的apache、mit等;
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
概念:
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:
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
仓库设置,“该仓库为私有的”前勾去掉,更新设置,再次web页面打开,刷新;
私有的仓库,必须登录,只能用户自己看,为了方便,修改为公有的;
点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密钥”
用户设置,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里内容;
File-->Close Project-->Checkout from Version Control,选Git;
Git Repository URL,Parent Directory,Directory Name,Test,Clone;
New-->Python File,app.py,Yes,编辑该文件;
VCS-->Git-->Add,同gitbash里$git add app.py;
VCS-->Commit
VCS-->Git-->Push-->Push;
私服查看;
stash存储:
#git stash #暂时存储最后一次提交后的变化,放到栈中;
#git stash list
#git stash pop #从栈中取出刚才保存的变化,并合并;
应用场景:
开发中,当前手中的工作没有完成,需要中断当前工作来完成其它请求,如修复bug,已完成的工作内容提交不合适,可能还需要大的调整,但是紧急请求又不能不做,就需要stash存储未完成的工作(上次提交后做的修改);
例(在pycharm中操作):
当前正在写dispatcher.py,发现之前提交的app.py有问题,当前正在开发的半成品如何处理?用stash;
VCS-->Git-->Stash Changes,Message(edit dispatcher)-->Create Stash,执行后,工作区回到了上次提交的样子;
修改app.py,提交
VCS-->Git-->UnStash Changes-->Apply Stash
例(命令行下操作):
branch分支:
多人协作一起开发,开发项目中不同的独立的功能,这些功能可能需要好几天才能完成,又或者定制版本,往往需要一个不同的定制需求;
代码中至少有一个分支,称主干分支或主分支master,默认都在主分支上开发;
图中圆圈,即节点,表示每一次提交;
项目往往是并行多人开发的,都在主分支上克隆,然后修改提交,那么主分支就会存在大量的冲突,甚至有一些不完善代码提交,主分支就乱如麻,不可维护了;
再次,如果一次提交后,需要发布一个版本,这个版本以后独立维护、开发,而主分支还需要继续发展,怎么办?引入分支;
分支名:
在版本库中必须唯一;
不能以-开头;
可用/开头,但不能以/结尾,被它分割的名称不能以.开头;
不能使用两个连续的.,如..;
不能包含任何空白字符,git的特殊符号;
创建分支:
需要指明从什么分支上创建什么名字的分支;
上图,均在master分支上,三种颜色重叠表示与私服同步且在主分支上;
Version Control-->右键某一次的commit-->New Branch,New Branch name(dev),勾选Checkout branch(检出分支就立即切换到dev分支);
修改app.py,commit and push
在私服上查看;
dev开发完成,需将功能合并到master,切换回到master,检出master;
Version Control-->右键最近一次的master上的提交(origin&master)-->Branch 'master'-->Checkout
VCS-->git-->Merge Changes,Branches to merge中选dev,Strategy中选No fast forward-->Merge
目前的合并,只是本地,再push到私服
fast forward、no fast forward:
ff,默认,合并后为一条线;
no fast forward,有交叉;
gitflow工作流:
不同公司,不同的项目规模,不同的管理水平有着不同git工作流方式;
最佳实践,使用git一般至少2个分支,master和develop;
master,生产环境都来主干分支上拿数据部署,也可以使用钩子自动完成;
develop,开发分支,开发人员都是检出这个分支开发;
win下Git GUI
注意:
函数不可以分前后,一般一个类交给某个人开发,除非这个类很大,由不同的人开发不同的方法;
最多的是模块化开发;
要有设计文档,如不同功能的类不可以同名;
大的项目最多拉3、4条分支;不建议拉多个分支;真正在开发时一般两条线,master&dev;
拉分支应由具有相应权限的人开;
开发人员都从dev分支上拉取,不能在master上拉取;达到某个里程碑再合并到master上;
master分支用于运维人员发布拉取;
commit时要保证是有效代码,不可以在分支上reset等回退之类的操作;
要会拉分支-->合并-->commit&push;
刚开始开发时要clone,clone会把.git目录带回来;不可以初始化,如果重新git init,git log中没内容;
©著作权归作者所有:来自51CTO博客作者chaijowin的原创作品,如需转载,请注明出处,否则将追究法律责任