手把手教你在 Ubuntu 上搭建 Git 伺服器
最近在寫一些指令碼,為了保持連續性,就在家也抽空趕進度,所以碰到了程式碼同步的問題,目前想到的方法有三個:
使用雲盤,這個拿來即用,但是因為雲盤還存放了其他一些東西,總是實時同步不太妥當;
使用 SVN,傳統的程式碼託管工具,一直在用;
使用 Git,最新的分散式程式碼託管工具,據說很強大。
最後決定使用 Git,主要是學習下最新的技術。下面是操作步驟,做記錄的同時也給其他同學做個指引:
先說下環境:
服務端: Ubuntu 16.04 x64
客戶端: Windows7 x64
服務端配置
先使用如下命令切到 root 許可權進行操作:
sudo bash
提示輸入密碼時,輸入 root 密碼即可。
登入成功後,開始安裝 git,命令:
apt-get install git
提示是否繼續時,輸入 y 後回車,安裝流程繼續,並直至安裝完成。
接著開始安裝 ssh,命令:
apt-get install openssh-server openssh-client
同樣在詢問是否繼續時,輸入 y 後回車,安裝會自動完成。
然後我們新建一個 git 專屬使用者,使用者名稱也叫 git,命令:
adduser git
新建成功後會提示設定使用者密碼,請設定一個自己能記住的密碼後繼續,後續的詳細資訊可以酌情填寫。
下面開始新建 git 倉庫,我們選定倉庫存放目錄為 /srv 下面,倉庫名 myfiles.git,所以命令:
git init --bare /srv/myfiles.git
因為當前使用者是 root,為了讓後面 git 專用賬戶能夠操作倉庫目錄,我們需要把倉庫目錄授權給 git,命令:
chown -R git:git /srv/myfiles.git/
客戶端操作
首先需要下載 Windows 版本的 git,下載地址:點選下載
下載完成後點選安裝,並根據提示點選「下一步」,直到安裝完成。
在客戶端建立一個工作目錄,比如我的是 gitdir,在工作目錄內右鍵並點選 「Git Bash Here」。
在彈出的命令後窗口 clone 倉庫到本地:
$ git clone [email protected]192.168.252.128:/srv/myfiles.git
Cloning into 'myfiles'...
The authenticity of host '192.168.252.128 (192.168.252.128)' can't be established.
ECDSA key fingerprint is SHA256:zqtjAg+FGfWrT3SCp1Qa2KqhE2UOy3PmudhhrTFlm7A.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.252.128' (ECDSA) to the list of known hosts.
[email protected]'s password:
warning: You appear to have cloned an empty repository.
注意請把「192.168.252.128」換成自己的服務端 ip,並且在確認時輸入的是「yes」,最後輸入的是建立 git 使用者時候的密碼。
為了客戶端進行後續的提交操作,我們還需要註明當前機器的使用者資訊,命令後如下:
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
註冊後,commit 的時候會使用這個註冊資訊來記錄操作人資訊,然後在使用 git log
時可以看到對應的資訊,效果如下圖:
$ git log
commit ae72bcc89ea8f5d9d3a44f0e00cf35e91a1afce8 (HEAD -> master, origin/master)
Author: sylan215 <[email protected]>
Date: Wed Oct 18 18:37:41 2017 +0800
測試提交
至此,我們完成整個配置過程。
檔案修改並同步到 Git 伺服器
配置完成後,我們就進入實際使用環節了。
首先我們先修改幾個檔案,並拷貝到 myfiles 目錄下,然後提交到服務端,在 myfiles 下執行提交命令:
git add .
git commit -am "測試提交"
git push
帶輸出的命令列內容:
$ git add .
$ git commit -am "測試提交"
[master (root-commit) ae72bcc] 測試提交
1 file changed, 1 insertion(+)
create mode 100644 test.txt
$ git push
[email protected]192.168.252.128's password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 223 bytes | 223.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 192.168.252.128:/srv/myfiles.git
* [new branch] master -> master
提示輸入密碼的地方,還是輸入的 git 賬戶的密碼。
說明:關於 git 操作的詳細命令,請參考 這篇文章
提交成功後,我們在另一臺機器上使用命令 git pull
同步最新內容:
$ git pull
[email protected]192.168.252.128's password:
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From 192.168.252.128:/srv/myfiles
ae72bcc..afad897 master -> origin/master
Updating ae72bcc..afad897
Fast-forward
test.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
對於多使用者的複雜操作,請參考這篇文章
其它配置
禁用 git 賬戶的 shell
為了安全考慮,如果需要禁用 git 賬戶的 shell,可以修改 /etc/passwd 檔案:
把其中的
git:x:1001:1001:git-user,,,:/home/git:/bin/bash
修改為
git:x:1001:1001:git-user,,,:/home/git:/usr/bin/git-shell
其中 /usr/bin/git-shell
的路徑可以通過命令 which git-shell
獲得。
使用公匙和私匙實現免密效果
上面我們使用的過程中每次都需要輸入 git 使用者的密碼才能和服務端互動,這樣會很麻煩,這時候我們可以配置公私匙來實現免密。
首先,需要在客戶端生成公私匙:
ssh-keygen -t rsa
回車後會提示輸入私匙的密碼,如果要免密就直接回車,否則自定義一個密碼(如果自定義了密碼,則每次 push 和 pull 時填入的是設定的密碼)。
命令執行成功後,會在當前使用者目錄的.ssh資料夾(Windows 目錄是 X:\Users{username}.ssh, Linux 是 /home/{username}/.ssh)生成檔案「id_rsa」和「id_rsa.pub」,其中 .pub 檔案就是公匙,另一個是私匙。
把檔案「id_rsa.pub」拷貝到服務端,並使用如下命令進行設定:
mkdir /home/git/.ssh
cp /home/currentuser/Desktop/id_rsa.pub /home/git/.ssh/authorized_keys
chown -R git:git /home/git/.ssh
說明,如果 authorized_keys 檔案不存在,可以使用 cp 命令,否則請使用 cat 命令追加,比如:
cat /home/currentuser/Desktop/id_rsa.pub >> /home/git/.ssh/authorized_keys
為了保證配置生效,還需要檢視 /etc/ssh/sshd_config 檔案中的如下設定是否開啟:
AuthorizedKeysFile %h/.ssh/authorized_keys
是否被註釋掉了,如果是,則需要把前面的 # 去掉,並重啟 ssh 服務(命令 service ssh restart)。
全部配置完畢後,我們試試效果:
$ git pull
Already up-to-date.
看,這次沒有提示輸入密碼了吧,免密設定生效。
非 22 埠連線 Git
在 .ssh 配置目錄現在 config 檔案,內容為:
host ip地址
port 埠名
config 配置檔案在 Windows 和 Mac 系統的位置為:X:/users/username/.ssh 目錄,其中 X 為系統盤, username 為當前登入使用者名稱;
如果是 liunx 系列系統,位置為 /home/username/.ssh 目錄,其中 username 為當前登入使用者名稱。
本文原創釋出於公眾號「sylan215」,十年測試老兵的原創乾貨,關注我,漲姿勢!