『網際網路架構』軟體架構-git服務搭建與使用(四)
很多跟我一樣大概有十多年的同事,一直做著企業內部開發,現在還在使用svn,跟大家聊起來git,他們都知道,只是專案裡用習慣了svn一直也沒改變,我相信這只是時間的問題,在不久的將來必然會使用git,正如我剛入行的時候ssh還是struts1 和hibernate。git更接近網際網路,更方便。有一次一個老鐵告訴我,他們是上市公司,研發中心負責管理總體的程式碼都在svn總部那邊,svn伺服器掛了,導致他想回退版本都沒辦法,因為本地都沒儲存之前的程式碼。如果是git我告訴你這些都不是問題,這就是分散式和集中化的區別。其實可以理解,傳統的行業還是svn佔據範圍比較大,git的使用還是要花費一定的時間,不想為工具上的事情花費時間也是可以理解的。原始碼:https://github.com/limingios/netFuture 裡面的git
GIT的原理和SVN的區別
- SVN
發展歷史
在2000年2月,他們聯絡《使用CVS開發開源專案》(Open Source Development with CVS)(Coriolis, 1999)的作者Karl Fogel,並徵求了他是否願意在這個新的專案中擔任一個角色。巧合的是,當時Karl已經和他的朋友Jim Blandy討論了一個關於新的 版本控制 系統的設計。在1995年,這兩人就成立了Cyclic Software,一個提供CVS的商業支援的軟體公司。雖然他們經營商業服務,但是仍然在每天都在工作中使用CVS。使用CVS的挫折感使得Jim認真思考更好的方法來管理資料,不但確定名字為“Subversion”,而且完成了Subversion檔案庫的基礎設計。當 CollabNet 的電話到來時,Karl立即答應了加入專案中,而且Jim讓他的僱主RedHat Software同意讓他在這個專案中不定期工作。CollabNet僱用了Karl和Ben Collins-Sussman,並在5月開始了詳細設計工作。在得到了來自CollabNet的Brian Behlendorf、Jason Robbins和Greg Stein(當時是一名活躍在WebDAV/DeltaV規範過程的自由程式設計師)很多創意的幫助下,Subversion很快地引起了一個活躍開發者社群的注意。它找出並歡迎很多同樣在CVS上受到挫折的社員能來為這個專案做點什麼。Subversion 最初的設計Team定下了幾個簡單的目標。 它必須在功能上可取代 CVS,也就是說, 所有 CVS 可做到的事, 它都要能夠作到。 在修正最明顯的瑕疵的同時, 還要保留相同的開發模式。 還有, Subversion 應該要和 CVS 很相像, 任何 CVS 使用者只要花費少許的力氣, 就可以很快地上手。經過十四個月的編碼後, Subversion 於2001年8月31日開始實現 “自行管理”。 也就是說, 開發人員不再使用 CVS 來管理 Subversion 的程式碼, 而以 Subversion 自己來管理。
SVN(Subversion)是集中式管理的版本控制器,而Git是分散式管理的版本控制器!這是兩者之間最核心的區別。SVN只有一個單一的集中管理的伺服器,儲存所有檔案的修訂版本,而協同工作的人們都通過客戶端連到這臺伺服器,取出最新的檔案或者提交更新。
版本庫是集中存放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以要先從中央伺服器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央伺服器。中央伺服器就好比是一個圖書館,你要改一本書,必須先從圖書館借出來,然後回到家自己改,改完了,再放回圖書館。
集中式版本控制系統最大的毛病就是必須聯網才能工作,如果在區域網內還好,頻寬夠大,速度夠快,可如果在網際網路上,遇到網速慢的話,可能提交一個10M的檔案就需要5分鐘,這還不得把人給憋死啊。
如果多人聯合開發,svn伺服器掛了,其他人都沒辦法提交,只能等待svn伺服器起起來,無法完成協同一起開發。本地的功能,只能不停的建立分支的方式來進行區別版本號。
- GIT <英文含義飯桶,傻瓜>
歷史發展
很多人都知道,Linus在1991年建立了開源的Linux,從此,Linux系統不斷髮展,已經成為最大的伺服器系統軟體了。Linus雖然建立了Linux,但Linux的壯大是靠全世界熱心的志願者參與的,這麼多人在世界各地為Linux編寫程式碼,那Linux的程式碼是如何管理的呢?事實是,在2002年以前,世界各地的志願者把原始碼檔案通過diff的方式發給Linus,然後由Linus本人通過手工方式合併程式碼!你也許會想,為什麼Linus不把Linux程式碼放到版本控制系統裡呢?不是有CVS、SVN這些免費的版本控制系統嗎?因為Linus堅定地反對CVS和SVN,這些集中式的版本控制系統不但速度慢,而且必須聯網才能使用。有一些商用的版本控制系統,雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。不過,到了2002年,Linux系統已經發展了十年了,程式碼庫之大讓Linus很難繼續通過手工方式管理了,社群的弟兄們也對這種方式表達了強烈不滿,於是Linus選擇了一個商業的版本控制系統BitKeeper,BitKeeper的東家BitMover公司出於人道主義精神,授權Linux社群免費使用這個版本控制系統。安定團結的大好局面在2005年就被打破了,原因是Linux社群牛人聚集,不免沾染了一些梁山好漢的江湖習氣。開發Samba的Andrew試圖破解BitKeeper的協議(這麼幹的其實也不只他一個),被BitMover公司發現了(監控工作做得不錯!),於是BitMover公司怒了,要收回Linux社群的免費使用權。Linus可以向BitMover公司道個歉,保證以後嚴格管教弟兄們,嗯,這是不可能的。開發 BitKeeper 的商業公司同 Linux 核心開源社群的合作關係結束,他們收回了免費使用 BitKeeper 的權力。這就迫使 Linux 開源社群(特別是 Linux 的締造者 Linus Torvalds )不得不吸取教訓,只有開發一套屬於自己的版本控制系統才不至於重蹈覆轍。他們對新的系統制訂了若干目標:
- 速度
-
簡單的設計
-
對非線性開發模式的強力支援(允許上千個並行開發的分支)
-
完全分散式
-
有能力高效管理類似 Linux 核心一樣的超大規模專案(速度和資料量)
最後實際情況是這樣的:Linus花了兩週時間自己用C寫了一個分散式版本控制系統,這就是Git!一個月之內,Linux系統的原始碼已經由Git管理了!牛是怎麼定義的呢?大家可以感受一下。
- git的生命週期
-
git 和svn的區別
SVN的特點是簡單,只是需要一個放程式碼的地方時用是OK的。
Git的特點版本控制可以不依賴網路做任何事情,對分支和合並有更好的支援(這應該算是開發者最關心的地方)。
- git 命令合集
搭建和使用gitlab
學過上邊的內容其實就夠了,但是如果你的定位不是小兵,而是一名技術的經理的話,不僅需要了解和掌握上邊的知識基本的命令,還需要搭建整個私服的gitlab環境。
- 歷史gitlab
最初,該產品命名為GitLab,是完全免費的開源軟體,按照MIT許可證分發。
2013年7月,產品被拆分為:GitLabCE(社群版)和GitLabEE(企業版),當時,GitLabCE和GitLabEE的許可仍然是根據MIT許可分發的免費和開源軟體。
2014年2月,GitLab宣佈採用開放核心業務模式。GitLabEE設定在專有許可證下,並且包含CE版本中不存在的功能。
2015年7月,公司又籌集了150萬美元的種子基金。截至2015年的客戶包括阿里巴巴集團,IBM和SpaceX。
2015年9月,GitLab從KhoslaVentures籌集了400萬美元的A系列資金。
2016年7月,GitLabCEO確認了公司的開放核心功能。
2016年9月,GitLab從AugustCapital和其他公司籌集了2000萬美元的B系列資金。
Gitlab於2017年1月31日釋出一系列緊急通告稱,位於荷蘭的系統管理員因操作失誤而刪除了包含310GB產品資料的資料夾,在取消刪除操作後僅剩下4.5GB。運維人員之後檢查發現,網站宣稱和配備的多項備份措施均未正常運作或難以利用。Gitlab在YouTube直播了恢復資料的過程。網站最終丟失了最後6小時的資料庫資料(包括問題、合併請求、評論、片段等,不含程式碼庫)。
- gitlab私服的搭建
本次的安裝gitlab,我直接使用docker的方式,去除了很多複雜的配置。
如果你按照正常的gitlab來進行安裝的話,裡面需要配置(麻煩死):
- 記憶體2G
- Nginx
- Redis
- Rub
- progsql
通過原始碼生成1個虛擬機器,準備工作。vagrant已經安裝了 對應的docker。
用docker安裝nexus就是為了避免環境變數,使用者賦權等複雜的操作。對於vagrant的如何安裝不用的系統不一樣可以參看
mac 安裝vgarant :https://idig8.com/2018/07/29/docker-zhongji-07/
window安裝vgaranthttps://idig8.com/2018/07/29/docker-zhongji-08/
系統型別 | IP地址 | 節點角色 | CPU | Memory | Hostname |
---|---|---|---|---|---|
Centos7 | 192.168.66.100 | git | 2 | 2G | git |
(1). 虛擬機器vagrant講述安裝的步驟

(2).機器window/mac開通遠端登入root使用者下
su - # 密碼 vagrant #設定 PasswordAuthentication yes vi /etc/ssh/sshd_config sudo systemctl restart sshd
(3). 安裝gitlab
通過shell指令碼的方式執行https://hub.docker.com/r/sonatype/nexus/
mkdir gitlab cd gitlab mkdir postgresql mkdir redis mkdir gitlab chown -R 200 data pwd ll vi start.sh
start.sh 我設定的使用者名稱:root 密碼123456789qwe
#!/bin/bash cur_dir=`pwd` docker stop gitlab-postgresql docker rm gitlab-postgresql docker stop gitlab-redis docker rm gitlab-redis docker stop gitlab docker rm gitlab docker run --name gitlab-postgresql -d \ --env 'DB_NAME=gitlabhq_production' \ --env 'DB_USER=gitlab' --env 'DB_PASS=password' \ --env 'DB_EXTENSION=pg_trgm' \ --volume ${cur_dir}/postgresql:/var/lib/postgresql \ sameersbn/postgresql:10 docker run --name gitlab-redis -d \ --volume ${cur_dir}/redis:/var/lib/redis \ sameersbn/redis:4.0.9-1 docker run --name gitlab -d \ --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \ --publish 10022:22 --publish 10080:80 \ --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \ --env 'GITLAB_ROOT_PASSWORD=123456789qwe' \ --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \ --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \ --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \ --volume ${cur_dir}/gitlab:/home/git/data \ sameersbn/gitlab
執行shell指令碼
sh start.sh
剛開始是這樣的 http://192.168.66.100:10080/ ,gitlab初始化後就正常了。
管理員:root 密碼:123456789qwe
git的使用技巧
- .gitignore 增加忽略檔案,新增和提交的時候自動忽略
- 開發的時候如果開發人員5個人(A,B,C,D,E),2018年12月12日要上線版本,A是專案組長,通過master建立分支release20181212,5個人的各自的分支分別是task_A_relase20181212,task_B_relase20181212,task_C_relase20181212,task_D_relase20181212,task_E_relase20181212。各自開發完畢,都通過merge的方式merge到release20181212,A在release20181212進行測試。如果B(緊急出現問題),B切換release20181212進行修復。 所有人都修復完畢後,release201212在由A,merge到master分支。
- 衝突的解決:臨鍵分支, 然後會退到上一次commit, 再pull 最新程式碼, 然後再與當前分支 merge, 然後再提交。
PS:可能你感覺不出來git的牛掰,如果是從比較小的公司來說,還不如用svn,尤其是大家都不太熟悉git的時候,現在是公司比較大的時候,專案的分支開發很快,例如我目前開發的專案每週一個分支,周4都要提交新的版本的時候,又有很多老鐵在並行開發的時候,svn絕對是管理不過來的,但是你用git的話,gitlab裡面有很多功能,分支的管理,提交的樹,很強大的真正開發的時候很亂很亂,全是線條,用svn估計是想都不敢想的,不僅僅本地提交的問題,不是git好不好用的問題,而是有沒有挑的問題,我們挑技術還是技術挑我們。如果公司用git,你非要用svn,你走人對吧。
>>原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
>>原文連結地址:上一篇:已是最新文章