搭建Git本地服務器及其使用方法詳解
搭建Git服務器
GitHub就是一個免費托管開源代碼的遠程倉庫。但是對于某些視源代碼如生命的商業(yè)公司來說,既不想公開源代碼,又舍不得給GitHub交保護費,那就只能自己搭建一臺Git服務器作為私有倉庫使用。
搭建Git服務器需要準備一臺運行Linux的機器,強烈推薦用Ubuntu或Debian,這樣,通過幾條簡單的apt命令就可以完成安裝。假設你已經有sudo權限的用戶賬號,下面,正式開始安裝。
第一步,安裝git:
$ sudo apt-get install git
第二步,創(chuàng)建一個gituser用戶,用來運行git服務:
$ sudo adduser gituser
第三步,創(chuàng)建證書登錄:
su gituser cd /home/gituser mkdir .ssh && chmod 700 .ssh touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導入到/home/gituser/.ssh/authorized_keys文件里,一行一個。
第四步,初始化Git倉庫:
一般來說git倉庫的名稱都是以.git結尾.先選定一個目錄作為Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令:
$ sudo git init --bare sample.git
Git就會創(chuàng)建一個裸倉庫,裸倉庫沒有工作區(qū),因為服務器上的Git倉庫純粹是為了共享,所以不讓用戶直接登錄到服務器上去改工作區(qū),并且服務器上的Git倉庫通常都以.git結尾。然后,把owner改為gituser:
$ sudo chown -R gituser:gituser sample.git
第五步,禁用shell登錄:
出于安全考慮,第二步創(chuàng)建的gituser用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成。找到類似下面的一行:
gituser:x:1001:1001:,,,:/home/gituser:/bin/bash
改為:
gituser:x:1001:1001:,,,:/home/gituser:/usr/bin/git-shell
注:這里“/usr/bin/git-shell”應該指的是git的二進制應用程序。
這樣,gituser用戶可以正常通過ssh使用git,但無法登錄shell,因為我們?yōu)間ituser用戶指定的git-shell每次一登錄就自動退出。
第六步,克隆遠程倉庫:
現在,可以通過git clone命令克隆遠程倉庫了,在各自的電腦上運行:沒有sudu
$ git clone gituser@server:/srv/sample.git Cloning into 'sample'... warning: You appear to have cloned an empty repository.
剩下的推送就簡單了。
提交代碼
git init // 初始化版本庫 git add . // 添加文件到版本庫(只是添加到緩存區(qū)),.代表添加文件夾下所有文件 git commit -m "first commit" // 把添加的文件提交到版本庫,并填寫提交備注
到目前為止,我們完成了代碼庫的初始化,但代碼是在本地,還沒有提交到遠程服務器,所以關鍵的來了,要提交到就遠程代碼服務器,進行以下兩步:
git remote add origin 你的遠程庫地址 // 把本地庫與遠程庫關聯 git push -u origin master // 第一次推送時 git push origin master // 第一次推送后,直接使用該命令即可推送修改
把本地庫的內容推送到遠程。使用 git push命令,實際上是把當前分支master推送到遠程。執(zhí)行此命令后會要求輸入用戶名、密碼,驗證通過后即開始上傳。
說明:用戶名密碼需要通過命令 ssh-keygen -t rsa -C “xxxxxx@qq.com”
進行創(chuàng)建,并且要把得到的秘鑰(公鑰)文件放到git服務器上,這樣才有權限進行代碼推送
管理公鑰
如果團隊很小,把每個人的公鑰收集起來放到服務器的/home/gituser/.ssh/authorized_keys文件里就是可行的。如果團隊有幾百號人,就沒法這么玩了,這時,可以用Gitosis來管理公鑰。
這里我們不介紹怎么玩Gitosis了,幾百號人的團隊基本都在500強了,相信找個高水平的Linux管理員問題不大。
管理權限
有很多不但視源代碼如生命,而且視員工為竊賊的公司,會在版本控制系統里設置一套完善的權限控制,每個人是否有讀寫權限會精確到每個分支甚至每個目錄下。因為Git是為Linux源代碼托管而開發(fā)的,所以Git也繼承了開源社區(qū)的精神,不支持權限控制。不過,因為Git支持鉤子(hook),所以,可以在服務器端編寫一系列腳本來控制提交等操作,達到權限控制的目的。Gitolite就是這個工具。
這里我們也不介紹Gitolite了,不要把有限的生命浪費到權限斗爭中。
小結
• 要方便管理公鑰,用Gitosis;
• 要像SVN那樣變態(tài)地控制權限,用Gitolite。
在Git服務器上首先需要將/etc/ssh/sshd_config中將RSA認證打開:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
在/home/git下創(chuàng)建.ssh目錄,然后創(chuàng)建authorized_keys文件,把id_rsa.pub里面的內容復制到authorized_keys文件中
service sshd restart
嚴重警告:
1. 必須保證git用戶的根目錄的文件夾權限為 755
2. 必須保證git用戶的根目錄下的.ssh文件夾權限為 700
3. 必須保證git用戶的根目錄下的.ssh文件夾中的authorized_keys文件的權限為 600
切換分支
git chechout 分支名
git init,git init—bare的區(qū)別
在初始化遠程倉庫時最好使用 git --bare init 而不要使用:git init
如果使用了git init初始化,則遠程倉庫的目錄下,也包含work tree,當本地倉庫向遠程倉庫push時, 如果遠程倉庫正在push的分支上(如果當時不在push的分支,就沒有問題), 那么push后的結果不會反應在work tree上, 也即在遠程倉庫的目錄下對應的文件還是之前的內容,必須得使用git reset --hard才能看到push后的內容.
在初始化遠程倉庫最好使用下面命令來初始化:
git --bare init
而不要使用:
git init
“普通庫”指用"git init"命令創(chuàng)建的GIT庫;
“裸庫”指用"git init –bare"命令創(chuàng)建的GIT庫;
當你創(chuàng)建一個普通庫時,在工作目錄下,除了.git目錄之外,你還可以看到庫中所包含的所有源文件。你擁有了一個可以進行瀏覽和修改(add, commit, delete等)的本地庫。
當你創(chuàng)建一個裸庫時,在工作目錄下,只有一個.git目錄,而沒有類似于本地庫那樣的文件結構可供你直接進行瀏覽和修改。但是你仍舊可以用git show命令來進行瀏覽,舉個例子(參數為某個commit的SHA1值):
git show 921dc435a3acd46e48e3d1e54880da62dac18fe0
一般來說,一個裸庫往往被創(chuàng)建用于作為大家一起工作的共享庫,每一個人都可以往里面push自己的本地修改。一個慣用的命名方式是在庫名后加上.git,舉個例子:
# mkdir example.git # cd example.git # git init --bare .
這樣你便擁有了一個叫做example的共享庫。在你自己的本地機器上,你可以用git remote add命令做初始化check-in:
// assume there’re some initial files you want to push to the bare repo you just created,// which are placed under example directory
# cd example # git init # git add * # git commit -m "My initial commit message" # git remote add origin git@example.com:example.git # git push -u origin master
項目團隊里面的每個人都可以clone這個庫,然后完成本地修改之后,往這個庫中push自己的代碼。
git clone git@example.com:example.git cd example git push origin <local_branch_name>:<remote_branch_name>
git刪除遠程文件夾或文件的方法如下,我把src里的全部移除,但是本地文件還保留。
git rm -r -n --cached */src/* //-n:加上這個參數,執(zhí)行命令時,是不會刪除任何文件,而是展示此命令要刪除的文件列表預覽。
git rm -r --cached */src/* //最終執(zhí)行命令.
git commit -m"移除src目錄下所有文件的版本控制" //提交
git push origin master //提交到遠程服務器
git裸倉庫設置默認分支
刪除一個遠程分支時出現錯誤提示:
$ git push --delete origin foobar
也就是foobar是遠程倉庫的當前分支(由于使用git clone --bare生成裸倉庫造成的),因為遠程倉庫是裸倉庫,所以不能使用普通的git checkout命令切換分支。在裸倉庫中使用如下命令來切換當前分支:
$ git symbolic-ref HEAD refs/heads/devel
這樣就將裸倉庫的當前分支切換為devel分支,刪除foobar分支就沒問題了。
$ git push origin :foobar
這個命令實質上是修改了.git/HEAD文件,使其內容為:
ref: refs/heads/devel
fatal: 不是一個有效的對象名:‘master’。
需要初始化倉庫了之后需要你向里面添加文件并提交,這是才可以用:git branch命令查詢到有master分支;
git pull錯誤:refusing to merge unrelated histories
問題場景重現:
我在本地建了個項目,在github新建了項目?,F在想把本地項目推送到github新建項目上。
給本地項目添加遠程項目倉庫地址:git remote add origin url
拉取遠程項目代碼:git pull origin master. 報錯"refusing to merge unrelated histories"
重新拉取:git pull --allow-unrelated-histories origin master,成功
原因:本地項目和托管項目是完全兩個不通的項目
! [已拒絕] master -> master (非快進)
可以這樣解決,強制更新:
git pull -f origin dev:dev
我每天使用 Git ,但是很多命令記不住。
一般來說,日常使用只要記住下圖6個命令,就可以了。但是熟練使用,恐怕要記住60~100個命令。
下面是我整理的常用 Git 命令清單。幾個專用名詞的譯名如下。
•Workspace:工作區(qū)
•Index / Stage:暫存區(qū)
•Repository:倉庫區(qū)(或本地倉庫)
•Remote:遠程倉庫
git commit 主要是將暫存區(qū)里的改動給提交到本地的版本庫
增加/刪除文件
添加指定文件到暫存區(qū)
$ git add [file1] [file2] …
添加指定目錄到暫存區(qū),包括子目錄
$ git add [dir]
添加當前目錄的所有文件到暫存區(qū)
$ git add .
添加每個變化前,都會要求確認 對于同一個文件的多處變化,可以實現分次提交
$ git add -p
刪除工作區(qū)文件,并且將這次刪除放入暫存區(qū)
$ git rm [file1] [file2] …
停止追蹤指定文件,但該文件會保留在工作區(qū)
$ git rm --cached [file]
改名文件,并且將這個改名放入暫存區(qū)
$ git mv [file-original] [file-renamed]
代碼提交# 提交暫存區(qū)到倉庫區(qū)
$ git commit -m [message]
提交暫存區(qū)的指定文件到倉庫區(qū)
$ git commit [file1] [file2] … -m [message]
提交工作區(qū)自上次commit之后的變化,直接到倉庫區(qū)
$ git commit -a
提交時顯示所有diff信息
$ git commit -v
使用一次新的commit,替代上一次提交 如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息
$ git commit --amend -m [message]
重做上一次commit,并包括指定文件的新變化
$ git commit --amend [file1] [file2] …
此后一般步驟:
sudo git init --bare GenerationDetection.git
sudo chown chatbot:chatbot GenerationDetection.git/
到此這篇關于搭建Git本地服務器及其使用方法詳解的文章就介紹到這了,更多相關搭建Git服務器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
采用軟件負載均衡器實現web服務器集群(iis+nginx)
我用nginx實現網站負載均衡測試的例子,windows下IIS做負載實測2016-04-04Linux下Web性能壓力測試工具http_load使用教程
http_load基于linux平臺的一種性能測工具。以并行復用的方式運行,用以測試web服務器的吞吐量與負載,測試web頁面的性能。2014-11-11服務器從安裝到配置陣列RAID1+RAID5?安裝Windows?Server?2019
今天就給安排上了——從RAID的配置開始,以及如何在WinPE里面載入陣列卡驅動、磁盤分區(qū)、安裝系統等,另外 ,圖片為操作過程中實拍,質量不高,敬請諒解2022-10-10