摘要:
git 作為目前世界上最先進的分布式版本控制系統,掌握如何使用git來做版本控制是現如今每個程序員必須掌握的技能。搭建git服務器、同樣也是必備技能之一。因為對于視源碼如生命的商業公司來說。源碼保密是必須的。但又不舍得給免費的git服務器交保護費,所以自己動手搭建git服務器成了幾乎所有公司的選擇。我同樣也做了這樣的選擇,在Mac下使用gitosis搭建git服務器。
說明:
環境:
macOS Sierra 10.12.6
賬戶:
本文是在一臺機器上搭建的。所以會涉及到兩個賬戶(用兩臺機器測試應該不用這么麻煩)。
1、一個是xyj
,mac一開始就創建的管理員賬戶。在本文,我將他作為git的客戶端,
2、另一個是git
賬戶,我們接下來將要創建的賬戶。在本文,我將他作為git的服務端
我這里是以xyj
賬戶登錄的Mac
介紹到此結束,開始正式流程
正式流程
創建git賬戶
系統偏好設置-> 用戶與群組。添加一個賬戶,賬戶名就叫git(可任意),作為服務器賬戶,普通成員權限即可。這里為了方便操作,創建的是管理員權限的賬戶。
設置遠程訪問
系統偏好設置-> 共享,勾選文件共享和遠程登錄(這里我看很多博客設置遠程登錄權限為所有用戶,本文測試只有兩個賬戶訪問該電腦,所以就單獨指定了這兩個賬戶,如果正式搭建公司應用的git服務器,應該要選擇所有用戶)。
下載安裝gitosis
1、mac系統默認安裝了Git和Python,可以使用如下命令查看版本信息:
? ~ git --version
git version 2.13.5 (Apple Git-94)
? ~ python --version
Python 2.7.12
2、通過命令git clone git://github.com/res0nat0r/gitosis.git
安裝gitosis
這一步是在服務器上(也就是本文中的git賬戶)運行的(我看很多博客都沒有說明這一點,我一開始測試的時候,在這里也遇到很大的困惑,特此說明)
命令如下
? ~ su git
Password:
su: Sorry
? ~ sudo su
Password:
sh-3.2# su git
bash-3.2$ ls
Applications Movies bin
Desktop Music cer
Documents Pictures dd
Downloads Public iCloud Drive(歸檔)
Ecredit-ios VirtualBox VMs oradiag_xyj
KeyChain_Demo XYJ.File 未命名文件夾
Library XYJPatchModule
bash-3.2$ cd ~
bash-3.2$ ls
Desktop Downloads Movies Pictures
Documents Library Music Public
bash-3.2$ git clone git://github.com/res0nat0r/gitosis.git
Cloning into 'gitosis'...
remote: Counting objects: 734, done.
remote: Total 734 (delta 0), reused 0 (delta 0), pack-reused 734
Receiving objects: 100% (734/734), 147.15 KiB | 74.00 KiB/s, done.
Resolving deltas: 100% (458/458), done.
bash-3.2$
在上面的命令里,首先通過su
切換到git
賬戶(只有在同一臺機器上有效),這里一開始切換的時候,報錯su:Sorry,這個問題,請參考 http://dev.son1c.com/show/1301.html,也就是運行sudo su
輸入當前賬戶的密碼,接下來就是正常的切換賬戶、以及gitosis的下載
3、進入gitosis目錄,使用命令sudo python setup.py install
來執行python腳本來安裝gitosis。
bash-3.2$ cd gitosis
bash-3.2$ ls
COPYING debian gitweb.conf
MANIFEST.in etc-event.d-local-git-daemon lighttpd-gitweb.conf
README.rst example.conf mirror.conf
TODO.rst gitosis setup.py
bash-3.2$ sudo python setup.py install
Password:
running install
running bdist_egg
running egg_info
creating gitosis.egg-info
......
Processing dependencies for gitosis==0.2
Searching for setuptools==23.1.0
Best match: setuptools 23.1.0
Adding setuptools 23.1.0 to easy-install.pth file
Installing easy_install script to /usr/local/bin
Installing easy_install-2.7 script to /usr/local/bin
Using /usr/local/lib/python2.7/site-packages
Finished processing dependencies for gitosis==0.2
這里輸入的密碼是服務器的密碼(也就是本文中git賬戶的密碼),在這里如果創建的git賬戶是普通的用戶權限會報錯 <font color=red size=3>xxx is not in the sudoers file.This incident will be reported</font>,創建的管理員賬戶的可以跳過這一段。
現在有兩種方式解決權限問題
- 找到sudoer文件,路徑在
磁盤 -> etc -> sudoers
也就是/etc/sudoers
,這個文件,一般用戶沒有訪問權限,只有root有讀寫權限。當你雙擊打開的時候會出現如下提示。
系統提示
按照提示,給當前用戶添加讀寫權限。然后找到root ALL=(ALL) ALL
這一行,在他下面添加xxx ALL=(ALL) ALL(這里xxx是你的用戶名,在這里我換成git),當你要做修改的時候,系統還是會提示系統提示
這時候,點擊復制,然后按照上面的修改好,保存一份到桌面(隨便放哪),替換etc
文件夾下的sudoers就ok
2.第2種辦法簡單多了。打開終端,切換到root
用戶下,運行visudo
命令,visudo
使用來編輯修改/etc/sudoers
配置文件的。命令如下
? ~ su root
Password:
su: Sorry
? ~ sudo su
Password:
sh-3.2#
打開的sudoers文件內容如下
##
## User alias specification
##
## Groups of users. These may consist of user names, uids, Unix groups,
## or netgroups.
# User_Alias ADMINS = millert, dowdy, mikef
##
## Cmnd alias specification
##
## Groups of commands. Often used to group related commands together.
# Cmnd_Alias PROCESSES = /usr/bin/nice, /bin/kill, /usr/bin/renice, \
# /usr/bin/pkill, /usr/bin/top
##
## Defaults specification
##
Defaults env_reset
Defaults env_keep += "BLOCKSIZE"
Defaults env_keep += "COLORFGBG COLORTERM"
Defaults env_keep += "__CF_USER_TEXT_ENCODING"
Defaults env_keep += "CHARSET LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE"
Defaults env_keep += "LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME"
Defaults env_keep += "LINES COLUMNS"
Defaults env_keep += "LSCOLORS"
Defaults env_keep += "SSH_AUTH_SOCK"
Defaults env_keep += "TZ"
Defaults env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"
Defaults env_keep += "EDITOR VISUAL"
Defaults env_keep += "HOME MAIL"
Defaults lecture_file = "/etc/sudo_lecture"
##
## Runas alias specification
##
##
## User privilege specification
##
root ALL=(ALL) ALL
%admin ALL=(ALL) ALL
## Uncomment to allow members of group wheel to execute any command
# %wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
## Uncomment to allow members of group sudo to execute any command
# %sudo ALL=(ALL) ALL
## Uncomment to allow any user to run sudo if they know the password
## of the user they are running the command as (root by default).
# Defaults targetpw # Ask for the password of the target user
# ALL ALL=(ALL) ALL # WARNING: only use this together with 'Defaults targetpw'
## Read drop-in files from /private/etc/sudoers.d
## (the '#' here does not indicate a comment)
#includedir /private/etc/sudoers.d
然后像第一種方法一樣將你的賬戶名添加進去就ok了。
解決了賬戶權限問題,就能安裝好gitosis了
制作ssh rsa公鑰
1、回到客戶端機器上,制作ssh公鑰(如果之前就有的話就不用制作了),如果你和我一樣是一臺機器兩個賬戶的話,終端輸入 exit
,知道退出到xyj
賬戶,也就是作為客戶端的賬戶。當然你也可以重新開一個終端。
接下來執行ssh-keygen -t rsa
運行結果如下:這里會讓你輸入三次,這邊我們都留空,直接回車即可。
bash-3.2$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/git/.ssh/id_rsa):
Created directory '/Users/git/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/git/.ssh/id_rsa.
Your public key has been saved in /Users/git/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:KjHgYHKIpIcsHRNXKc3KsljzH+2eHfNI28bKLRPNFJE git@xyjiMac.local
The key's randomart image is:
+---[RSA 2048]----+
| .+..+.. .o |
|=+ +. + E |
|Oo=. o . |
|+=+.o . |
| o.=o .S + |
|. . .o... . o |
| ...o +o |
| .. .=oOo |
| .o *=+ |
+----[SHA256]-----+
找到這個目錄:
bash-3.2$ cd ~
bash-3.2$ cd .ssh
bash-3.2$ ls
id_rsa id_rsa.pub
這兩個文件,.pub后綴的就是公鑰(英文public)
接下來想辦法把這個公鑰給服務器,不同機器的話,通過QQ,U盤,郵件都隨意。
然后把公鑰放到服務器 /tmp 目錄下
因為是同一臺機器,所以我們直接用代碼將該文件從客戶端賬戶復制到服務器賬戶即可,拷貝的時候,為了區分,我們重命名了一下
cp id_rsa.pub /tmp/git.pub
公鑰安放完畢后,使用ssh公鑰初始化gitosis:
接下來的操作都是在服務器賬戶執行的
切換命令如下:這段命令其實上面有,為了閱讀的連貫性,這里再次貼一下。
? ~ su git
Password:
su: Sorry
? ~ sudo su
Password:
sh-3.2# su git
bash-3.2$ cd ~
bash-3.2$ ls
Desktop Downloads Movies Pictures
Documents Library Music Public
執行初始化操作命令,git.pub替換為你剛才復制到/tem目錄下的公鑰。
bash-3.2$ sudo -H -u git gitosis-init < /tmp/git.pub
Initialized empty Git repository in /Users/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /Users/git/repositories/gitosis-admin.git/
初始化完成后,會有如上兩段代碼。同時在git的home目錄下創建了repositories
bash-3.2$ ls
Desktop Downloads Movies Pictures gitosis
Documents Library Music Public repositories
在這里,會將該 client 當做認證受信任的賬戶,因此在git
的home
目錄下會有記錄,文件 authorized_keys 的內容與 git.pub(公鑰) 差不多。
我們可以定位到該文件查看一下
bash-3.2$ cd ~
bash-3.2$ cd .ssh
bash-3.2$ ls
authorized_keys
可以看到authorized_keys
,這里我們需要將authorized_keys
稍作修改,將里面的<font color=red size=3>command="gitosis-serve yourname",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty</font> 這一行刪掉。這里你可以用文本編輯器修改,也可以用Vim修改,看個人習慣,就不多說了
接下來修改一下post-update的權限,便于客戶端提交
bash-3.2$ sudo chmod 755 /Users/git/repositories//gitosis-admin.git/hooks/post-update
bash-3.2$ cd ~
bash-3.2$ cd repositories
bash-3.2$ ls
gitosis-admin.git
bash-3.2$
從上面的命令可以看到,gitosis也是作為倉庫的形式給出的,我們可以在其他賬戶下clone,然后對gitosis進行配置管理等等,而無需使用服務器的git賬戶進行
最后一步,修改git賬戶的PATH路徑
bash-3.2$ touch ~/.bashrc
bash-3.2$ echo PATH=/usr/local/bin:/usr/local/git/bin:\$PATH > .bashrc
bash-3.2$ echo export PATH >> .bashrc
bash-3.2$ cat .bashrc
PATH=/usr/local/bin:/usr/local/git/bin:$PATH
export PATH
出現最后兩行則說明修改完成
至此,服務器的配置完成。
客戶端測試
1、退出到客戶端(xyj
)賬戶,或者重新打開一個終端。驗證下服務器是否聯通,將下面的git@172.16.11.154
換成你的服務器名稱和地址即可。
輸出如下:
? ~ ssh git@172.16.11.154
Last login: Mon Dec 4 19:34:55 2017 from 172.16.11.154
2、在本地clone服務器倉庫,下面以gitosis-admin.git為例:
? Desktop git clone git@172.16.11.154:repositories/gitosis-admin.git
Cloning into 'gitosis-admin'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (5/5), done.
至此,我們已經把gitosis-admin
clone到本地了,進入目錄,我們可以看到里面有一個文件和文件夾
gitosis.conf 該配置文件就是用來控制讀寫權限的,可以用文本編輯打開。
keydir 文件夾是存放ssh公鑰的地方,所以之前我們重命名了公鑰。
打開gitosis.conf,可以看到如下一段:
[gitosis]
[group gitosis-admin]
members = lixp@ixinyongjia.com
writable = gitosis-admin
group代表一個組
members是此倉庫的成員,只有成員才有權限讀寫,右邊的組員名稱就是公鑰的名字。如果有多個成員,中間用空格分開。例如:
members = zhang3 li4 wang5
writable是倉庫名,即文件夾名。
下面我們模擬創建一個公司項目、并用git管理
假設項目名為test
1、切換到服務器賬戶,或者去服務器所在的機器,進入repositories目錄,然后創建一個名為test的遠程倉庫:
bash-3.2$ cd ~
bash-3.2$ ls
Desktop Downloads Movies Pictures gitosis
Documents Library Music Public repositories
bash-3.2$ cd repositories/
bash-3.2$ mkdir test.git
bash-3.2$ ls
gitosis-admin.git test.git
bash-3.2$ git init --bare
Initialized empty Git repository in /Users/git/repositories/test.git/
然后回到客戶端,去任意目錄創建test文件夾,終端進入到該文件夾內,然后輸入如下代碼,就初始化好了并完成本地的git倉庫與服務器遠程的關聯。
? test git init
Initialized empty Git repository in /Users/xyj/Desktop/test/.git/
? test git:(master) git remote add origin git@172.16.11.154:repositories/test.git
其他命令這里就不多做介紹了,可以看我另一篇博客
然后我們就能在test文件夾里面新建我們的項目了。
寫在最后
寫這篇文章主要是記錄我在Mac下搭建git服務器的總結,同樣給一些有需求的小伙伴一個比較全一點的教程、所以有出錯的地方或描述不到位的。請各位小伙伴提出來,我盡快改正。
參考
http://blog.csdn.net/boy15174/article/details/8645320
http://blog.csdn.net/kesalin/article/details/6943770
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000
http://blog.csdn.net/dream_angel_z/article/details/45841109