Mac下使用gitosis搭建git服務(wù)器

摘要:

git 作為目前世界上最先進(jìn)的分布式版本控制系統(tǒng),掌握如何使用git來做版本控制是現(xiàn)如今每個(gè)程序員必須掌握的技能。搭建git服務(wù)器、同樣也是必備技能之一。因?yàn)閷?duì)于視源碼如生命的商業(yè)公司來說。源碼保密是必須的。但又不舍得給免費(fèi)的git服務(wù)器交保護(hù)費(fèi),所以自己動(dòng)手搭建git服務(wù)器成了幾乎所有公司的選擇。我同樣也做了這樣的選擇,在Mac下使用gitosis搭建git服務(wù)器。

說明:

環(huán)境:

macOS Sierra 10.12.6

賬戶:

本文是在一臺(tái)機(jī)器上搭建的。所以會(huì)涉及到兩個(gè)賬戶(用兩臺(tái)機(jī)器測試應(yīng)該不用這么麻煩)。

1、一個(gè)是xyj,mac一開始就創(chuàng)建的管理員賬戶。在本文,我將他作為git的客戶端,

2、另一個(gè)是git賬戶,我們接下來將要?jiǎng)?chuàng)建的賬戶。在本文,我將他作為git的服務(wù)端

我這里是以xyj賬戶登錄的Mac

介紹到此結(jié)束,開始正式流程


正式流程

創(chuàng)建git賬戶

創(chuàng)建git賬戶

系統(tǒng)偏好設(shè)置-> 用戶與群組。添加一個(gè)賬戶,賬戶名就叫g(shù)it(可任意),作為服務(wù)器賬戶,普通成員權(quán)限即可。這里為了方便操作,創(chuàng)建的是管理員權(quán)限的賬戶。

設(shè)置遠(yuǎn)程訪問

設(shè)置遠(yuǎn)程訪問

系統(tǒng)偏好設(shè)置-> 共享,勾選文件共享和遠(yuǎn)程登錄(這里我看很多博客設(shè)置遠(yuǎn)程登錄權(quán)限為所有用戶,本文測試只有兩個(gè)賬戶訪問該電腦,所以就單獨(dú)指定了這兩個(gè)賬戶,如果正式搭建公司應(yīng)用的git服務(wù)器,應(yīng)該要選擇所有用戶)。

下載安裝gitosis

1、mac系統(tǒng)默認(rèn)安裝了Git和Python,可以使用如下命令查看版本信息:


檢測是否安裝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
這一步是在服務(wù)器上(也就是本文中的git賬戶)運(yùn)行的(我看很多博客都沒有說明這一點(diǎn),我一開始測試的時(shí)候,在這里也遇到很大的困惑,特此說明)

命令如下

?  ~ 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賬戶(只有在同一臺(tái)機(jī)器上有效),這里一開始切換的時(shí)候,報(bào)錯(cuò)su:Sorry,這個(gè)問題,請(qǐng)參考 http://dev.son1c.com/show/1301.html,也就是運(yùn)行sudo su輸入當(dāng)前賬戶的密碼,接下來就是正常的切換賬戶、以及gitosis的下載

3、進(jìn)入gitosis目錄,使用命令sudo python setup.py install來執(zhí)行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

這里輸入的密碼是服務(wù)器的密碼(也就是本文中g(shù)it賬戶的密碼),在這里如果創(chuàng)建的git賬戶是普通的用戶權(quán)限會(huì)報(bào)錯(cuò) <font color=red size=3>xxx is not in the sudoers file.This incident will be reported</font>,創(chuàng)建的管理員賬戶的可以跳過這一段。

現(xiàn)在有兩種方式解決權(quán)限問題

  1. 找到sudoer文件,路徑在磁盤 -> etc -> sudoers也就是/etc/sudoers,這個(gè)文件,一般用戶沒有訪問權(quán)限,只有root有讀寫權(quán)限。當(dāng)你雙擊打開的時(shí)候會(huì)出現(xiàn)如下提示。
    系統(tǒng)提示

    按照提示,給當(dāng)前用戶添加讀寫權(quán)限。然后找到root ALL=(ALL) ALL這一行,在他下面添加xxx ALL=(ALL) ALL(這里xxx是你的用戶名,在這里我換成git),當(dāng)你要做修改的時(shí)候,系統(tǒng)還是會(huì)提示
    系統(tǒng)提示

    這時(shí)候,點(diǎn)擊復(fù)制,然后按照上面的修改好,保存一份到桌面(隨便放哪),替換etc文件夾下的sudoers就ok

2.第2種辦法簡單多了。打開終端,切換到root用戶下,運(yùn)行visudo命令,visudo使用來編輯修改/etc/sudoers配置文件的。命令如下

?  ~ su root
Password:
su: Sorry
?  ~ sudo su
Password:
sh-3.2#

打開的sudoers文件內(nèi)容如下

##
## 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

然后像第一種方法一樣將你的賬戶名添加進(jìn)去就ok了。

解決了賬戶權(quán)限問題,就能安裝好gitosis了

制作ssh rsa公鑰

1、回到客戶端機(jī)器上,制作ssh公鑰(如果之前就有的話就不用制作了),如果你和我一樣是一臺(tái)機(jī)器兩個(gè)賬戶的話,終端輸入 exit,知道退出到xyj賬戶,也就是作為客戶端的賬戶。當(dāng)然你也可以重新開一個(gè)終端。

接下來執(zhí)行ssh-keygen -t rsa

運(yùn)行結(jié)果如下:這里會(huì)讓你輸入三次,這邊我們都留空,直接回車即可。

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]-----+

找到這個(gè)目錄:

bash-3.2$ cd ~
bash-3.2$ cd .ssh
bash-3.2$ ls
id_rsa      id_rsa.pub

這兩個(gè)文件,.pub后綴的就是公鑰(英文public)
接下來想辦法把這個(gè)公鑰給服務(wù)器,不同機(jī)器的話,通過QQ,U盤,郵件都隨意。
然后把公鑰放到服務(wù)器 /tmp 目錄下

因?yàn)槭峭慌_(tái)機(jī)器,所以我們直接用代碼將該文件從客戶端賬戶復(fù)制到服務(wù)器賬戶即可,拷貝的時(shí)候,為了區(qū)分,我們重命名了一下

cp id_rsa.pub /tmp/git.pub

公鑰安放完畢后,使用ssh公鑰初始化gitosis:
接下來的操作都是在服務(wù)器賬戶執(zhí)行的

切換命令如下:這段命令其實(shí)上面有,為了閱讀的連貫性,這里再次貼一下。

?  ~ 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

執(zhí)行初始化操作命令,git.pub替換為你剛才復(fù)制到/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/

初始化完成后,會(huì)有如上兩段代碼。同時(shí)在git的home目錄下創(chuàng)建了repositories

bash-3.2$ ls
Desktop     Downloads   Movies      Pictures    gitosis
Documents   Library     Music       Public      repositories

在這里,會(huì)將該 client 當(dāng)做認(rèn)證受信任的賬戶,因此在githome 目錄下會(huì)有記錄,文件 authorized_keys 的內(nèi)容與 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修改,看個(gè)人習(xí)慣,就不多說了

接下來修改一下post-update的權(quán)限,便于客戶端提交

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,然后對(duì)gitosis進(jìn)行配置管理等等,而無需使用服務(wù)器的git賬戶進(jìn)行

最后一步,修改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

出現(xiàn)最后兩行則說明修改完成

至此,服務(wù)器的配置完成。

客戶端測試

1、退出到客戶端(xyj)賬戶,或者重新打開一個(gè)終端。驗(yàn)證下服務(wù)器是否聯(lián)通,將下面的git@172.16.11.154換成你的服務(wù)器名稱和地址即可。

輸出如下:

?  ~ ssh git@172.16.11.154
Last login: Mon Dec  4 19:34:55 2017 from 172.16.11.154

2、在本地clone服務(wù)器倉庫,下面以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.

至此,我們已經(jīng)把gitosis-adminclone到本地了,進(jìn)入目錄,我們可以看到里面有一個(gè)文件和文件夾
gitosis.conf 該配置文件就是用來控制讀寫權(quán)限的,可以用文本編輯打開。
keydir 文件夾是存放ssh公鑰的地方,所以之前我們重命名了公鑰。

打開gitosis.conf,可以看到如下一段:

[gitosis]

[group gitosis-admin]
members = lixp@ixinyongjia.com
writable = gitosis-admin

group代表一個(gè)組
members是此倉庫的成員,只有成員才有權(quán)限讀寫,右邊的組員名稱就是公鑰的名字。如果有多個(gè)成員,中間用空格分開。例如:

members = zhang3 li4 wang5  

writable是倉庫名,即文件夾名。

下面我們模擬創(chuàng)建一個(gè)公司項(xiàng)目、并用git管理

假設(shè)項(xiàng)目名為test

1、切換到服務(wù)器賬戶,或者去服務(wù)器所在的機(jī)器,進(jìn)入repositories目錄,然后創(chuàng)建一個(gè)名為test的遠(yuǎn)程倉庫:

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/

然后回到客戶端,去任意目錄創(chuàng)建test文件夾,終端進(jìn)入到該文件夾內(nèi),然后輸入如下代碼,就初始化好了并完成本地的git倉庫與服務(wù)器遠(yuǎn)程的關(guān)聯(lián)。

?  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文件夾里面新建我們的項(xiàng)目了。

寫在最后

寫這篇文章主要是記錄我在Mac下搭建git服務(wù)器的總結(jié),同樣給一些有需求的小伙伴一個(gè)比較全一點(diǎn)的教程、所以有出錯(cuò)的地方或描述不到位的。請(qǐng)各位小伙伴提出來,我盡快改正。

參考

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容