Linux 學習筆記(二):搭建個人Git伺服器

半斤桃花發表於2018-11-20

Git的安裝

詳細學習可以到:Git 官方教程

依賴安裝

[root@centos7 ~] yum install git
[root@centos7 ~] git --version

Git 版本:git version 1.8.3.1

編譯安裝

Git Hub 選擇 release版本

Git 的依賴 curl-devel expat-devel gettext-devel openssl-devel zlib-devel

進行下載、解壓、配置、編譯、安裝

[root@centos7 ~] yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
[root@centos7 ~] wget https://codeload.github.com/git/git/tar.gz/v2.20.0-rc0
[root@centos7 ~] tar -xvf v2.20.0-rc0
[root@centos7 ~] make configure
[root@centos7 ~] ./configure
[root@centos7 ~] make && make install

此處使用 ./configure 直接使用預設配置,實際上和 yum 沒什麼區別了

[root@centos7 ~] git --version

Git 版本:git version 2.20.0-rc0

  • 建立 Git 使用者

為了訪問的便捷,我們使用 git 使用者的身份來建立程式碼倉庫,實際上使用任何使用者都是可以的,區別在於在 git clone 的時候,需將 git@server 改成別的使用者名稱

[root@centos7 ~] adduser git
[root@centos7 ~] passwd git
  • Git 的 SSH 協議使用 SSH key 免密鑑權

The authorized_keys file in SSH specifies the SSH keys that can be used for logging into the user account for which the file is configured.

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

所以我們明白了 authorized_keys 檔案是用以儲存已授權的客戶端公鑰。具體參見: SSH原理
如果在建立「ssh-key」的時候使用了「passphrase」 ,那麼使用「SSH」的「method: publickey」方式進行連線時會報出一個提示:Enter passphrase for key `/home/git/.ssh/id_rsa`,與免密登入違背了

[root@centos7 ~] su git
[root@centos7 ~] ssh-keygen -t rsa
[root@centos7 ~] cat /home/git/.ssh/id_rsa.pub >> /home/git/.ssh/authorized_keys
[root@centos7 ~] chmod 700 /home/git/.ssh

+---[RSA 2048]----+    
|o. +XE=o.        |    # -t:指定生成金鑰型別(rsa、dsa、ecdsa等)
|o.=+=*=          |    # -P:指定passphrase,用於確保私鑰的安全    
| . . o B o       |    # -f:指定存放金鑰的檔案  
|  .   = .        |
|o+.oo* o o       |    
|o o ..+ + .      |    # authorized_keys    #儲存已授權的客戶端公鑰
|.  o +.oS. .     |    # known_hosts        #儲存已認證的遠端主機ID
|.   o B.+ .      |    # id_rsa.pub         #儲存公鑰
|       .         |    # id_rsa             #儲存私鑰
+----[SHA256]-----+

authorized_keys新增需要授權 shell 登入使用者的公鑰,首先「server」向「client」傳送一個隨機數值,使用者在「client」返回使用金鑰加密隨機數後的密文在「server」進過公鑰解密與原隨機數進行比對從而完成一次認證過程

  • 測試 publickey 方式登入
[root@centos7 ~] ssh -vv git@104.199.134.0  #追溯兩層錯誤

如果出現錯誤,根據 debug 的關鍵字搜尋。其中大部分原因可以分為兩種:

1. SSH 配置問題
2. 檔案許可權問題
  • 基本配置
    StrictModes                     no                           #關閉嚴格校驗
    
    RSAAuthentication               yes                          #允許RSA認證
        
    PubkeyAuthentication            yes                          #允許公鑰認證
    
    AuthorizedKeysFile              .ssh/authorized_keys         #ssh檔案位置
    
    PasswordAuthentication          yes                          #允許密碼認證
  • 正常使用的:sshd_config
    Protocol                         2

    SyslogFacility                   AUTH

    LogLevel                         debug

    PermitRootLogin                  yes

    RSAAuthentication                yes

    PubkeyAuthentication             yes

    AuthorizedKeysFile               .ssh/authorized_keys

    PasswordAuthentication           yes

    ChallengeResponseAuthentication  no

    GSSAPIAuthentication             yes

    GSSAPICleanupCredentials         yes

    UsePAM                           yes

    AcceptEnv                        LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES

    AcceptEnv                        LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT

    AcceptEnv                        LC_IDENTIFICATION LC_ALL LANGUAGE

    AcceptEnv                        XMODIFIERS

    X11Forwarding                    yes

    Subsystem                        sftp    /usr/libexec/openssh/sftp-server

更改檔案許可權

[root@centos7 ~] chmod 700 /home/git/.ssh
[root@centos7 ~] chmod 600 /home/git/.ssh/authorized_keys
  • 正常登入效果
[root@centos7 ~]$ ssh git@104.199.134.0

The authenticity of host `104.199.134.0 (104.199.134.0)` can`t be established.
ECDSA key fingerprint is SHA256:49g0X6kyudjfjCa/QBoZwf0mbPZnFphYjMRV/LrQPpQ.
ECDSA key fingerprint is MD5:cc:ef:83:ab:e4:33:00:9e:0f:62:87:df:62:01:73:62.
Are you sure you want to continue connecting (yes/no)? 

登入後 .ssh 下就生成了 known_hosts

[root@centos7 ~]$ vim /home/git/.ssh/known_hosts

104.199.134.0 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABEBPA/O+a8s92uinv3NKnVzGqaohbX6vqDVGMoE5vs+PuT7NXivy5aSkRutROcN/H8AhnBLaK5HWGsqwBRw8FXgSY=
  • 禁用 shell 登入

因為git使用者是專門用來上傳程式碼的,所以禁用git使用者的登入許可權

將 /sbin/nologin 作為 git 使用者的登入 shell,即禁止 git使用者 shell 登入

[root@centos7 ~] usermod -s /sbin/nologin git   #禁止shell登入
[root@centos7 ~] usermod -s /bin/bash git       #恢復預設shell

本地倉庫

[root@centos7 ~] su - git
[root@centos7 ~] git init sea.git

git init 用來搭建本地倉庫,在工程中使用的 commit 儲存到本地倉庫

遠端倉庫

[root@centos7 ~] su - git
[root@centos7 ~] git init --bare sea.git

git init –bare 用來搭建遠端倉庫,在工程中使用 push 推送到遠端倉庫

  • 初始化 Git 倉庫

前面我們建立了 git 使用者,那麼 git 使用者的 home 目錄變可以用來當倉庫路徑

這裡的 git 倉庫便是遠端倉庫了,使用者們使用 push 命令將更新推送到遠端倉庫,使用 –bare 選項執行 git init 來建立一個裸倉庫

倉庫字尾都是 .git

建立遠端倉庫目錄並初始化了空的倉庫

[root@centos7 ~] cd /home/git/
[root@centos7 ~] mkdir sea.git
[root@centos7 ~] git init --bare sea.git

git 不僅可以做本地開發的版本控制,更多還用與團隊寫作的迭代開發。普通倉庫儲存著工程程式碼、版本歷史,遠端的裸倉庫即版本庫僅包含記錄著版本歷史的檔案

使用 git init –bare 方法建立一個所謂的裸倉庫,之所以叫裸倉庫是因為這個倉庫只儲存git歷史提交的版本資訊,而不允許使用者在上面進行各種git操作,如果你硬要操作的話,只會得到下面的錯誤: This operation must be run in a work tree

專案拉取

協議介紹

  • 本地協議

所謂的遠端倉庫在該協議(Local protocol)中的表示,就是硬碟上的另一個目錄。這常見於團隊每一個成員都對一個共享的檔案系統(例如 NFS)擁有訪問權,或者比較少見的多人共用同一臺電腦的情況。

  • Git 協議

用 Git 協議作為訪問專案的唯一方法通常是不可取的。一般的做法是,同時提供 SSH 介面,讓幾個開發者擁有推送(寫)許可權,其他人通過 git:// 擁有隻讀許可權。

這是一個包含在 Git 軟體包中的特殊守護程式; 它會監聽一個提供類似於 SSH 服務的特定埠(9418),而無需任何授權。打算支援 Git 協議的倉庫,需要先建立 git-daemon-export-ok 檔案 — 它是協議程式提供倉庫服務的必要條件 — 但除此之外該服務沒有什麼安全措施。要麼所有人都能克隆 Git 倉庫,要麼誰也不能。這也意味著該協議通常不能用來進行推送。你可以允許推送操作;然而由於沒有授權機制,一旦允許該操作,網路上任何一個知道專案 URL 的人將都有推送許可權。

  • SSH 協議

SSH 也是唯一一個同時支援讀寫操作的網路協議。也是預設協議

[root@centos7 ~] git clone ssh://user@server/project.git
[root@centos7 ~] git clone user@server:project.git
  • HTTP/S 協議

HTTP 或 HTTPS 協議的優美之處在於架設的簡便性。基本上,只需要把 Git 的裸倉庫檔案放在 HTTP 的根目錄下,配置一個特定的 post-update 掛鉤(hook)就可以搞定(Git 掛鉤的細節見第 7 章)。此後,每個能訪問 Git 倉庫所在伺服器上 web 服務的人都可以進行克隆操作。

程式碼拉取

  • 使用密碼

操作環境:windows clone 虛擬機器的遠端倉庫

[root@centos7 ~] git clone git@192.168.108.128:/home/git/sea.git

# Cloning into `sea`...
# git@192.168.108.128`s password:
# warning: You appear to have cloned an empty repository.
  • SSH 拉取
[root@centos7 ~] git clone git@164.109.134.117:/home/git/sea.git

# Cloning into `test1.git`...
# done.
# warning: You appear to have cloned an empty repository.
  • 非預設埠的SSH協議拉取程式碼
[root@centos7 ~] git clone ssh://git@193.29.97.24:14726/home/git/star.git
  • 設定配置資訊
[root@centos7 ~] git config --global user.email "sea.star.com"
[root@centos7 ~] git config --global user.name "sea"
[root@centos7 ~] git config --global -- list

# user.email=sea@star.com
# user.name=sea

專案推送

  • 一個專案push到多個遠端Git倉庫

檢視遠端倉庫

[root@centos7 ~] git remote -v

# origin    git@193.29.97.24:/home/git/sea.git (fetch)
# origin    git@193.29.97.24:/home/git/sea.git (push)
  • 在遠端倉庫建立對應的裸倉庫
[root@centos7 ~] git init --bare star.git

新增遠端倉庫

[root@centos7 ~] git remote add star ssh://git@193.29.97.24:14726/home/git/star.git

再次檢視遠端倉庫

[root@centos7 ~] git remote -v

# origin    git@193.29.97.24:/home/git/sea.git (fetch)
# origin    git@193.29.97.24:/home/git/sea.git (push)
# upstream    ssh://git@193.29.97.24:14726/home/git/star.git (fetch)
# upstream  ssh://git@193.29.97.24:14726/home/git/star.git (push)

刪除遠端倉庫

[root@centos7 ~] git remote rm upstream
[root@centos7 ~] git remote -v

# origin    git@193.29.97.24:/home/git/sea.git (fetch)
# origin    git@193.29.97.24:/home/git/sea.git (push)

這種方式的多個遠端倉庫需要分別推送

繫結多個倉庫

[root@centos7 ~] git remote set-url --add origin ssh://193.29.97.25:/home/git/taskv2.git
[root@centos7 ~] git remote -v

# origin    git@193.29.97.24:/home/git/sea.git (fetch)
# origin    git@193.29.97.24:/home/git/sea.git (push)
# origin    git@193.29.97.25:/home/git/sea.git (push)

提交修改,推送到了兩個遠端倉庫去了

[root@centos7 ~]$ git push origin master

#     Enumerating objects: 4, done.
#     Counting objects: 100% (4/4), done.
#     Compressing objects: 100% (2/2), done.
#     Writing objects: 100% (3/3), 271 bytes | 271.00 KiB/s, done.
#     Total 3 (delta 1), reused 0 (delta 0)
#     To ssh://104.199.134.0:/home/git/star.git
#        b0785b2..5db23a4  master -> master

#     Enumerating objects: 4, done.
#     Counting objects: 100% (4/4), done.
#     Compressing objects: 100% (2/2), done.
#     Writing objects: 100% (3/3), 271 bytes | 271.00 KiB/s, done.
#     Total 3 (delta 1), reused 0 (delta 0)
#     To ssh://93.179.97.24:27038/home/git/star.git
#        b0785b2..5db23a4  master -> master
  • 檢視所有分支
git branch -a

  bug
  doc
* master
  remotes/origin/bug
  remotes/origin/doc
  remotes/origin/master
  • 刪除遠端分支
git push branch :branchname

To ssh://127.0.0.1/home/git/repository.git
 - [deleted]           branchname
  • 關於 Git 版本的選擇

Git的升級策略大多是安全更新,少有重大新特性更新,升級可能會引入系統失效陷阱,由此浪費的時間精力完全不必要。

相關文章

Linux 學習筆記(一):內網穿透
Linux 學習筆記(二):搭建個人Git伺服器
Linux 學習筆記(三):Ubuntu 作業系統
Linux 學習筆記(四):Docker
Linux 學習筆記(五):Redis
Linux 學習筆記(六):Linux

相關文章