創(chuàng)建版本庫
什么是版本庫呢?版本庫又名倉庫司训,英文名repository,你可以簡單理解成一個目錄液南,這個目錄里面的所有文件都可以被Git管理起來壳猜,每個文件的修改、刪除滑凉,Git都能跟蹤统扳,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”畅姊。
首先咒钟,選擇一個合適的地方,創(chuàng)建一個空目錄:
mkdir test
cd test
如果你使用Windows系統(tǒng)若未,為了避免遇到各種莫名其妙的問題朱嘴,請確保目錄名(包括父目錄)不包含中文。
第二步粗合,通過git init
命令把這個目錄變成Git可以管理的倉庫:
git init
命令執(zhí)行很快萍嬉,到文件夾下查看會多出一個 .git
文件夾,默認為隱藏可使用ls -ah
命令查看隙疚,不要動這個文件夾下的東西壤追,改亂了會把倉庫破壞掉。
不一定非得在空目錄下創(chuàng)建git倉庫供屉,有文件的目錄也是可以創(chuàng)建的行冰。
工作區(qū)和暫存區(qū)
Git和其他版本控制系統(tǒng)如SVN的一個不同之處就是有暫存區(qū)的概念。
工作區(qū)
工作區(qū)可以簡單的理解為是git倉庫目錄下內(nèi)容.-
暫存區(qū)
回顧一下, 在將內(nèi)容提交到倉庫時候, 需要先使用git add一下, 此時這個add其實是吧內(nèi)容提交到stage暫存區(qū), 在執(zhí)行commit的使用才會將stage暫存區(qū)中的內(nèi)容提交到工作區(qū).
git add命令將文件提交到緩存區(qū)
git commit命令將文件提交到工作區(qū) -
先在本目錄創(chuàng)建一個文件
touch readme.txt 或 vim readme.txt //編寫文件內(nèi)容 111111
-
把文件添加到暫存區(qū)
$ git add `file_name`
-
把文件提交到工作區(qū)
$ git commit -m "m1" [master (root-commit) cb926e7] m1 1 file changed, 2 insertions(+) create mode 100644 readme.txt
簡單解釋一下git commit
命令伶丐,-m
后面輸入的是本次提交的說明悼做,可以輸入任意內(nèi)容,當然最好是有意義的哗魂,這樣你就能從歷史記錄里方便地找到改動記錄肛走。
提示:每次修改,如果不add到暫存區(qū)啡彬,那就不會加入到commit中
為什么Git添加文件需要add羹与,commit一共兩步呢?因為commit可以一次提交很多文件庶灿,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
可以通過命令
git status
查看是否還有文件未被提交吃衅,他是用來查看狀態(tài)的往踢。
$ git status-
如果文件修改,輸入命令
git diff
可以查看文件內(nèi)容做了什么修改
$ git diff 'file_name'
小結(jié):初始化一個Git倉庫徘层,使用
git init
命令峻呕。添加文件到Git倉庫利职,分兩步:
第一步,使用命令
git add <file_name>
瘦癌,注意猪贪,可反復(fù)多次使用,添加多個文件讯私;第二步热押,使用命令
git commit
,完成斤寇。查看倉庫狀態(tài)
git status
查看文件修改了那些內(nèi)容
git diff file_name
版本回退
先把文件內(nèi)容改一下桶癣,增加一行內(nèi)容:222222,執(zhí)行以下命令
$ git add readme.txt
$ git commit -m "添加內(nèi)容11111"
我們已經(jīng)對文件更改了兩次娘锁,想要查看一下歷史使用命令
$ git log
如果嫌輸出信息太多牙寞,看得眼花繚亂的,可以試試加上
--pretty=oneline
參數(shù):
提示:像
db41fe81cf9b5
這樣一長串的是版本號(commit id
)莫秆。
如果想要回退到哪個版本需要命令:
$ git reset --hard 版本號
提示: 版本號沒必要寫全间雀,前幾位就可以了,Git會自動去找镊屎。當然也不能只寫前一兩位雷蹂,因為Git可能會找到多個版本號,就無法確定是哪一個了杯道。
如果已經(jīng)回退到以前的某個版本匪煌、但現(xiàn)在想要回到最新版、但用git log
查看版本號已經(jīng)沒有最新版的版本號党巾, 可以用命令:
$ git reflog
這條命令用來記錄你的每一次命令的萎庭。
小結(jié):
HEAD指向的版本就是當前版本,因此齿拂,Git允許我們在版本的歷史之間穿梭驳规,使用命令git reset --hard commit_id。
穿梭前署海,用git log可以查看提交歷史吗购,以便確定要回退到哪個版本。
要重返未來砸狞,用git reflog查看命令歷史捻勉,以便確定要回到未來的哪個版本。
撤消修改
當你改亂了工作區(qū)某個文件的內(nèi)容刀森,想直接丟棄工作區(qū)的修改時踱启,用命令
$ git checkout --`file_name`
當你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改埠偿,分兩步透罢,命令:
$ git reset HEAD `file_name`
$ git checkout --`file_name`
刪除文件
一般情況下 ,刪除文件用命令:
$ rm readme.txt
這個時候git知道你刪除了文件工作區(qū)個版本庫不一致了冠蒋,用 git status
命令查看羽圃,git會告訴你哪些文件被刪除了
現(xiàn)在就有兩個選擇了,一種是用命令把文件刪除:
$ git rm `file_name`
$ git commit -m "注釋" //提交一下
另一種是刪錯了抖剿,因為版本庫里還在朽寞,使用命令把誤刪的文件恢復(fù)到最新版本:
$ git checkout --`file_name`
git checkout
其實是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除牙躺,都可以“一鍵還原”愁憔。
遠程倉庫
Git是分布式版本控制系統(tǒng),同一個Git倉庫孽拷,可以分布到不同的機器上吨掌。最初,只有一臺機器有一個原始版本庫脓恕,此后膜宋,別的機器可以“克隆”這個原始版本庫,而且每臺機器的版本庫其實都是一樣的炼幔,并沒有主次之分秋茫。并且一臺電腦上也是可以克隆多個版本庫的,只要不在同一個目錄下(不過很少有這種需求)乃秀。實際情況往往是這樣肛著,找一臺電腦充當服務(wù)器的角色,每天24小時開機跺讯,其他每個人都從這個“服務(wù)器”倉庫克隆一份到自己的電腦上枢贿,并且各自把各自的提交推送到服務(wù)器倉庫里,也從服務(wù)器倉庫中拉取別人的提交刀脏。(可以自己用一臺電腦搭建git環(huán)境作為遠程倉庫, 也可以使用GitHub)
GitHub(神奇的網(wǎng)站 - 遠程倉庫)
首先局荚,創(chuàng)建SSH Key。在用戶主目錄下愈污,看看有沒有.ssh目錄耀态,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub
這兩個文件暂雹,如果已經(jīng)有了首装,可直接跳到下一步。如果沒有擎析,打開Shell(Windows下打開Git Bash)簿盅,創(chuàng)建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
(你需要把郵件地址換成你自己的郵件地址挥下,然后一路回車揍魂,使用默認值即可桨醋,由于這個Key也不是用于軍事目的,所以也無需設(shè)置密碼现斋。)
如果一切順利的話喜最,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個文件庄蹋,這兩個就是SSH Key的秘鑰對瞬内,id_rsa是私鑰,不能泄露出去限书,id_rsa.pub是公鑰虫蝶,可以放心地告訴任何人。
- 登陸GitHub倦西,打開“Account settings”能真,“SSH Keys”頁面:
點“Add Key”,你就應(yīng)該看到已經(jīng)添加的Key:
說明:
為什么GitHub需要SSH Key呢扰柠?因為GitHub需要識別出你推送的提交確實是你推送的粉铐,而不是別人冒充的,而Git支持SSH協(xié)議卤档,所以蝙泼,GitHub只要知道了你的公鑰,就可以確認只有你自己才能推送劝枣。
添加遠程庫
-
要關(guān)聯(lián)一個遠程庫汤踏,使用命令git remote add origin
git@server-name:path/repo-name.git;
關(guān)聯(lián)后舔腾,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容溪胶;
此后,每次本地提交后琢唾,只要有必要载荔,就可以使用命令git push origin master推送最新修改;
分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠程庫的存在采桃,也就是有沒有聯(lián)網(wǎng)都可以正常工作懒熙,而SVN在沒有聯(lián)網(wǎng)的時候是拒絕干活的!當有網(wǎng)絡(luò)的時候普办,再把本地提交推送一下就完成了同步工扎!
從遠程庫克隆
從零開發(fā),那么最好的方式是先創(chuàng)建遠程庫衔蹲,然后肢娘,從遠程庫克隆呈础。
先在GitHub創(chuàng)建一個倉庫(創(chuàng)建默認的readme.md)
使用命令git clone克隆一個本地庫(多人開發(fā)就每個人都clone一份):
$ git clone git@github.com:michaelliao/gitskills.git
說明:
GitHub給出的地址不止一個,還可以用
https:// github.com/michaelliao/gitskills.git這樣的地址橱健。
實際上而钞,Git支持多種協(xié)議,默認的git://使用ssh拘荡,但也可以使用https等其他協(xié)議臼节。
分支管理
-
分支是什么
分支就類似于一個平行的空間, 其相互之間是獨立的, 在各個分支上工作是各不影響的
-
分支的作用
假設(shè)你準備開發(fā)一個新功能,但是需要兩周才能完成珊皿,第一周你寫了50%的代碼网缝,如果立刻提交,由于代碼還沒寫完蟋定,不完整的代碼庫會導(dǎo)致別人不能干活了粉臊。如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險驶兜。
有了分支扼仲,你創(chuàng)建了一個屬于你自己的分支,別人看不到促王,還繼續(xù)在原來的分支上正常工作犀盟,而你在自己的分支上干活,想提交就提交蝇狼,直到開發(fā)完畢后阅畴,再一次性合并到原來的分支上,這樣迅耘,既安全贱枣,又不影響別人工作。
創(chuàng)建與合并分支
在Git里只有一個主分支master
分支颤专。HEAD
嚴格來說不是指向提交纽哥,而是指master
,master
才是指向提交的栖秕,所以春塌,HEAD
指向的就是當前分支。
再新創(chuàng)建一個dev
分支后簇捍,并且切換到這個分支只壳,則新建的dev
指向提交,將HEAD
指向的是dev
分支暑塑,此后吼句,提交內(nèi)容,dev指針向前挪動事格,master
不變惕艳,將分支合并到主分支則是master
指正指向分支現(xiàn)在的位置搞隐,刪除分支則是去掉dev
分支即可。
創(chuàng)建一個分支 dev:
$ git checkout -b dev
git checkout
命令加上-b
參數(shù)表示創(chuàng)建并切換远搪,相當于以下兩條命令:
$ git branch dev
$git checkout dev
然后劣纲,用git branch
命令查看當前分支:
$ git branch
* dev
master
git branch
命令會列出所有分支,當前分支前面會標一個*
號终娃。
然后味廊,我們就可以在dev
分支上正常提交蒸甜,比如對readme.txt做個修改棠耕,加上一行:
222222
然后提交:
$ git add readme.txt
$ git commit -m "branch test"
[dev fec145a] branch test
1 file changed, 1 insertion(+)
現(xiàn)在,dev
分支的工作完成柠新,我們就可以切換回master
分支:
$ git checkout master
Switched to branch 'master
切換回master
分支后窍荧,再查看一個readme.txt
文件,剛才添加的內(nèi)容不見了恨憎!因為那個提交是在dev
分支上蕊退,而master分支此刻的提交點并沒有變,現(xiàn)在,我們把dev
分支的工作成果合并到master
分支上:
$ git merge dev
Updating d17efd8..fec145a
Fast-forward readme.txt | 1 +
1 file changed, 1 insertion(+)
這時在去看readme.md文件, 會發(fā)現(xiàn)剛才修改的內(nèi)容有出現(xiàn)了, 因為命令是master分支指向了dev的位置.
刪除分支:
$ git branch -d dev
$ git branch
* master
提示:
Git鼓勵大量使用分支:
查看分支:git branch
創(chuàng)建分支:git branch <name>
切換分支:git checkout <name>
創(chuàng)建+切換分支:git checkout -b <name>
合并某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
解決沖突
如果在分支上做了修改, 并且在master
分支上也做了修改, 這時候合并就會造成沖突, 無法’快速合并’, 需要手動合并
以下代碼是在兩個分支上進行修改:
合并兩個分支:
此時, 再去test.md文件看下內(nèi)容, 會有以下內(nèi)容
將以上內(nèi)容手動修改成你需要的內(nèi)容后再add commit, 并輸入命令git log –graph來查看合并記錄:
提示:
當Git無法自動合并分支時憔恳,就必須首先解決沖突瓤荔。解決沖突后,再提交钥组,合并完成输硝。
用git log --graph
命令可以看到分支合并圖。
分支管理策略
通常程梦,合并分支時点把,如果可能,Git會用Fast forward模式屿附,但這種模式下郎逃,刪除分支后,會丟掉分支信息挺份。
如果要強制禁用Fast forward模式褒翰,Git就會在merge時生成一個新的commit,這樣匀泊,從分支歷史上就可以看出分支信息优训。
合并分支時,加上–no-ff參數(shù)就可以用普通模式合并探赫,合并后的歷史有分支型宙,能看出來曾經(jīng)做過合并。而fast forward
合并就看不出來曾經(jīng)做過合并伦吠。
$ git merge --no-ff -m 'merge with no-ff' dev
Bug分支
在執(zhí)行某些特殊任務(wù)時, 就像處理必須立即解決的Bug, 這時就行中斷請求一樣, 需要先保護一下現(xiàn)場, 處理結(jié)束后再恢復(fù)現(xiàn)場, git的Bug分支就類似如此, 在處理突發(fā)Bug時, 如果當前分支上的任務(wù)完成一半, 又不可以提交, 這時可以通過git stash命令把當前工作現(xiàn)場“儲藏”起來.
處理Bug在需要的地方建立臨時分支, 處理完Bug后合并到對應(yīng)的分支, 再刪掉臨時分支即可.
處理完Bug后, 可以通過命令git stash list
來查看之前’儲存’的現(xiàn)場, 工作現(xiàn)場還在妆兑,Git把stash內(nèi)容存在某個地方了魂拦,但是需要恢復(fù)一下扔罪,有兩個辦法: - 一是用git stash apply
恢復(fù)哮幢,但是恢復(fù)后,stash內(nèi)容并不刪除装蓬,你需要用git stash drop
來刪除 - 另一種方式是用git stash pop
腺逛,恢復(fù)的同時把stash內(nèi)容也刪了
Feature分支
在軟件開發(fā)時, 會有新需求加入, 這時明智的做法是新建一個feature
分支, 在分支上開發(fā)這個功能進行測試, 這樣才不會影響到master分支, 開發(fā)成功后再刪除這個測試分支即可.
如果新功能需求突然取消, 此時這個分支還沒有合并, 但必須銷毀這個分支, 此時使用命令git branch -d xxxx
, 分支還沒有被合并荷愕,如果刪除,將丟失掉修改棍矛,如果要強行刪除安疗,需要使用命令git branch -D xxxx
。這時根據(jù)提示即可刪除了.
多人協(xié)作
多人協(xié)作, 往往要用到遠程倉庫, 那么要如何解決與遠程倉庫之間的同步以及和伙伴代碼合并的問題呢?
和遠程倉庫同步
當你從遠程倉庫克隆時够委,實際上Git自動把本地的master分支和遠程的master分支對應(yīng)起來了荐类,并且,遠程倉庫的默認名稱是origin茁帽。
可是使用git remote查看遠程倉庫的信息
$ git remote
origin
或者玉罐,使用git remote -v查看詳細的信息
$ git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
上面顯示了可以抓取和推送的origin的地址。如果沒有推送權(quán)限潘拨,就看不到push的地址吊输。
推送分支
推送分支,就是把該分支上的所有本地提交推送到遠程庫铁追。推送時季蚂,要指定本地分支,這樣脂信,Git就會把該分支推送到遠程庫對應(yīng)的遠程分支上, 比如下面這句就是吧本地的master分支推送到遠程的master分支上:
$ git push origin master
但是并不是所有分支都需要推送, 像一些大家都需要用到的諸如: master(主分支), dev(開發(fā)分支)等這些需要推送, 像一些只是自己完成任務(wù)的獨立分支, 類似:bug(修改bug的分支)就不用推送, 除非你的老板想知道你都修改了哪些bug.
抓取分支
多人協(xié)作時癣蟋,大家都會往master和dev分支上推送各自的修改。
當你的協(xié)作伙伴從遠程clone時, 他只能看到master分支, 如果想看到dev等其他分支, 狰闪,就必須創(chuàng)建遠程origin的dev分支到本地疯搅,可以使用這個命令創(chuàng)建本地dev分支:
$ git checkout -b dev origin/dev
此后, 你的伙伴就可以在分支上做修改了, 并且會提交修改, 如果他提交后(此時有個問題: 你手里的版本已經(jīng)不是最新版本了), 你同樣做好了修改需要提交, 這時當你pull時, 你會發(fā)現(xiàn)報錯, 因為你和你的伙伴可能修改了同樣的文件, 這就和前面分支合并一樣, 出現(xiàn)了沖突. 解決辦法也很簡單,Git已經(jīng)提示我們埋泵,就是先用git pull把最新的提交從origin/dev抓下來幔欧,然后,在本地合并丽声,解決沖突礁蔗,再推送(這時可能會git pull失敗,原因是沒有指定本地dev分支與遠程origin/dev分支的鏈接,根據(jù)提示雁社,設(shè)置dev和origin/dev的鏈接).
創(chuàng)建分支鏈接
$ git branch --set-upstream dev origin/dev
然后pull到本地
$ git pull
這時, 在本地對伙伴修改的內(nèi)容和自己修改的內(nèi)容進行合并, 會有合并沖突, 需要手動解決, 解決后在推送.
注意:
多人協(xié)作的工作模式通常是這樣:
- 可以試圖用git push origin branch-name推送自己的修改浴井;
- 如果推送失敗,則因為遠程分支比你的本地更新霉撵,需要先用git pull試圖合并磺浙;
- 如果合并有沖突洪囤,則解決沖突,并在本地提交撕氧;
- 沒有沖突或者解決掉沖突后瘤缩,再用git push origin branch-name推送就能成功!
- 如果git pull提示“no tracking information”伦泥,則說明本地分支和遠程分支的鏈接關(guān)系沒有創(chuàng)建剥啤,用命令git branch –set-upstream branch-name origin/branch-name。
說明:
- 查看遠程庫信息不脯,使用
git remote -v
府怯; - 本地新建的分支如果不推送到遠程,對其他人就是不可見的跨新;
- 從本地推送分支富腊,使用
git push origin branch-name
,如果推送失敗域帐,先用git pull抓取遠程的新提交; - 在本地創(chuàng)建和遠程分支對應(yīng)的分支是整,使用
git checkout -b branch-name origin/branch-name
肖揣,本地和遠程分支的名稱最好一致; - 建立本地分支和遠程分支的關(guān)聯(lián)浮入,使用
git branch –set-upstream branch-name origin/branch-name
龙优; - 從遠程抓取分支,使用git pull事秀,如果有沖突彤断,要先處理沖突。
標簽管理
標簽(tag), 一個簡單的理解就是它記錄了一次commit id, tag一般建立在主分支上, 方便用于版本發(fā)布. 標簽和分支類似, 一個指針指向某次提交, 只不過分支可以繼續(xù)先前移動, 而標簽不可移動.
創(chuàng)建標簽
在創(chuàng)建標簽前需要先切換到需要打標簽的分支上, 然后使用命令 git tag v1.0
來創(chuàng)建標簽. 默認標簽是打在HEAD指向的地方(即最新提交), 如果想把標簽創(chuàng)建在先前的提交上, 需要先知道commit id
(用命令git log –pretty oneline –abbrev-commit
), 然后用命令 git tag v0.9 6224937
在對應(yīng)的提交上打上標簽, 可以使用 git tag
查看所有標簽, 使用命令git show v0.9
來查看標簽詳細信息.
還可以創(chuàng)建帶有說明的標簽易迹,用-a指定標簽名宰衙,-m指定說明文字:
$ git tag -a v0.1 -m "version 0.1 released" 3628164
還可以通過-s用私鑰簽名一個標簽:
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a
注意:
簽名采用PGP簽名,因此睹欲,必須首先安裝gpg(GnuPG)供炼,如果沒有找到gpg,或者沒有g(shù)pg密鑰對窘疮,就會報錯
操作標簽
如果標簽打錯了袋哼,也可以刪除:
$ git tag -d v0.1
如果要推送某個標簽到遠程,使用命令:
$ git push origin v1.0
或者闸衫,一次性推送全部尚未推送到遠程的本地標簽:
$ git push origin --tags
如果標簽已經(jīng)推送到遠程涛贯,要刪除遠程標簽就麻煩一點,先從本地刪除:
$ git tag -d v0.9
然后蔚出,從遠程刪除弟翘。刪除命令也是push含懊,但是格式如下:
$ git push origin :refs/tags/v0.9
使用GitHub
在GitHub上,可以任意Fork開源倉庫衅胀;
自己擁有Fork后的倉庫的讀寫權(quán)限岔乔;
可以推送pull request給官方倉庫來貢獻代碼
自定義Git
讓Git顯示顏色,會讓命令輸出看起來更醒目:
$ git config --global color.ui true
忽略特殊文件
在工作目錄下創(chuàng)建.gitignore文件, 在這個文件中填寫需要忽略的文件內(nèi)容, 然后git add進去. 此后這個.gitignore就開始起作用了.
忽略文件的原則是:
- 忽略操作系統(tǒng)自動生成的文件滚躯,比如縮略圖等雏门;
- 忽略編譯生成的中間文件、可執(zhí)行文件等掸掏,也就是如果一個文件是通過另一個文件自動生成的茁影,那自動生成的文件就沒必要放進版本庫,比如Java編譯產(chǎn)生的.class文件丧凤;
- 忽略你自己的帶有敏感信息的配置文件募闲,比如存放口令的配置文件。
如果有些時候愿待,你想添加一個文件到Git浩螺,但發(fā)現(xiàn)添加不了,原因是這個文件被.gitignore忽略了.
如果你確實想添加該文件仍侥,可以用-f強制添加到Git:
$ git add -f App.class
或者你發(fā)現(xiàn)要出,可能是.gitignore寫得有問題,需要找出來到底哪個規(guī)則寫錯了农渊,可以用git check-ignore命令檢查:
$ git check-ignore -v App.class
配置別名
通過以下命令將status 縮寫成st
$ git config --global alias.st status
搭建Git服務(wù)器
搭建Git服務(wù)器需要準備一臺運行Linux的機器患蹂,強烈推薦用Ubuntu或Debian,這樣砸紊,通過幾條簡單的apt命令就可以完成安裝传于。
假設(shè)你已經(jīng)有sudo權(quán)限的用戶賬號,下面醉顽,正式開始安裝沼溜。
第一步,安裝git
$ sudo apt-get install git
第二步徽鼎,創(chuàng)建一個git用戶盛末,用來運行g(shù)it服務(wù)
$ sudo adduser git
第三步,創(chuàng)建證書登錄
收集所有需要登錄的用戶的公鑰否淤,就是他們自己的id_rsa.pub
文件悄但,把所有公鑰導(dǎo)入到/home/git/.ssh/authorized_keys
文件里,一行一個石抡。
第四步檐嚣,初始化Git倉庫:
先選定一個目錄作為Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令:
$ sudo git init --bare sample.git
第五步嚎京,禁用shell登錄:
出于安全考慮嗡贺,第二步創(chuàng)建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd
文件完成鞍帝。找到類似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改為:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣诫睬,git用戶可以正常通過ssh使用git,但無法登錄shell帕涌,因為我們?yōu)間it用戶指定的git-shell
每次一登錄就自動退出摄凡。
第六步,克隆遠程倉庫:
現(xiàn)在蚓曼,可以通過git clone
命令克隆遠程倉庫了亲澡,在各自的電腦上運行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就簡單了。
管理公鑰
如果團隊很小纫版,把每個人的公鑰收集起來放到服務(wù)器的/home/git/.ssh/authorized_keys
文件里就是可行的床绪。如果團隊有幾百號人,就沒法這么玩了其弊,這時癞己,可以用Gitosis
來管理公鑰。
這里我們不介紹怎么玩Gitosis
了瑞凑,幾百號人的團隊基本都在500強了末秃,相信找個高水平的Linux管理員問題不大。
管理權(quán)限
有很多不但視源代碼如生命籽御,而且視員工為竊賊的公司,會在版本控制系統(tǒng)里設(shè)置一套完善的權(quán)限控制惰匙,每個人是否有讀寫權(quán)限會精確到每個分支甚至每個目錄下技掏。因為Git是為Linux源代碼托管而開發(fā)的,所以Git也繼承了開源社區(qū)的精神项鬼,不支持權(quán)限控制哑梳。不過,因為Git支持鉤子(hook)绘盟,所以鸠真,可以在服務(wù)器端編寫一系列腳本來控制提交等操作,達到權(quán)限控制的目的龄毡。Gitolite就是這個工具吠卷。