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的原創作品,如需轉載,請注明出處,否則將追究法律責任