Git的安裝
詳細學習可以到:Git 官方教程
依賴安裝
[root@centos7 ~] yum install git
[root@centos7 ~] git --version
Git 版本:git version 1.8.3.1
編譯安裝
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 免密鑑權
- centos7 裡的 ssh 配置
# 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