Mac下使用gitosis搭建git服务器

摘要:

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(可任意),作为服务器账户,普通成员权限即可。这里为了方便操作,创建的是管理员权限的账户。

设置远程访问

设置远程访问

系统偏好设置-> 共享,勾选文件共享和远程登录(这里我看很多博客设置远程登录权限为所有用户,本文测试只有两个账户访问该电脑,所以就单独指定了这两个账户,如果正式搭建公司应用的git服务器,应该要选择所有用户)。

下载安装gitosis

1、mac系统默认安装了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
这一步是在服务器上(也就是本文中的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>,创建的管理员账户的可以跳过这一段。

现在有两种方式解决权限问题

  1. 找到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 当做认证受信任的账户,因此在githome 目录下会有记录,文件 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-adminclone到本地了,进入目录,我们可以看到里面有一个文件和文件夹
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

推荐阅读更多精彩内容