折腾这个东东整整一天了。。。搜索网上那么多相关文章,实践下来各种问题,都办法整成功,好在功夫不负有心人,最终还是搞出来了。
主要参考了以下两篇文章:
https://blog.csdn.net/dddxxxx/article/details/49050145
https://blog.csdn.net/water_horse/article/details/68958140
下面简单记录一下搭建过程,我是 ubuntu18.04,本教程基本适用于目前主流版本的 ubuntu(14.x、16.x)。
正文开始。
sudo apt-get update
sudo apt-get install git-core openssh-server openssh-client
git-core 是git版本控制核心软件。
安装 openssh-server 和 openssh-client 是由于git需要通过ssh协议来在服务器与客户端之间传输文件。
(因为我用的阿里云实例 ubuntu18.04 已经预安装了 git 和 ssh 服务了,所有我在这里不需要再装)
gitosis 是一套用来管理 authorized_keys 文件和实现简单连接限制的脚本。
它可以通过一个名叫 gitosis-admin.git 的 Git 仓库,实现对用户和权限的管理。
也就是说,你只需要在这个 gitosis-admin.git 上做相应的配置修改,然后 push 你的修改,gitosis 即可实现相应的仓库权限控制。
接下来,开始安装 gitosis。
由于 gitosis 的安装需要用到 python 脚本和工具,所以需要
先安装 python 的 setuptools:
sudo apt-get install python-setuptools
接着安装 gitosis:
安装之前需要先初始化一下 git 的用户和邮箱,这两个值随便即可:
git config --global user.name "lai"
git config --global user.email "[email protected]"
cat ~/.gitconfig ### 查看 git 设置的用户信息
获取 gitosis 版本文件
git clone https://github.com/res0nat0r/gitosis.git
下载完成,进入 gitosis 文件夹,然后使用 setup.py 脚本安装
cd gitosis/
sudo python setup.py install
好了,gitosis 到这里就安装完了,是不是很简单~(这里只是安装,当然简单,后面的配置才麻烦而已,表急,我们继续)
sudo adduser git
### 这里会提示输入密码,我这边设置的密码也是 git 。
查看 /home ,会发现多了一个 git 的文件夹,这个文件夹是 git 用户的专属文件夹。
然后在 /home 下新建一个用于 git 仓库存储的文件夹 gitrepo ,并将权限给 git 用户,其他用户可读:
sudo mkdir /home/gitrepo
sudo chown git:git /home/gitrepo
sudo chmod 755 /home/gitrepo
由于 gitosis 默认情况下会将仓库放在 git 用户的 repositories 下,也就是项目仓库的默认路径是 /home/git/repositories/。
又由于我们想的仓库路径是刚新建的 /home/gitrepo/ ,所以就需要在 /home/git 下设置一个名叫 repositories 软链接,让它映射到我们的仓库文件夹 /home/gitrepo/ :
sudo ln -s /home/gitrepo /home/git/repositories
这样一来,访问 /home/git/repositories/ 文件夹时,实际访问的就是 /home/gitrepo/ 了。
为何要生成 ssh 公钥?初始化 gitosis 有啥用?(至少我当时有这么些疑问..)
前面说过,gitosis 是通过一个名为 gitosis-admin.git 的特殊仓库,来实现对其他项目仓库的一些配置文件(如:用户权限)进行管理的。
这个 gitosis-admin.git 仓库从哪来?从 gitosis 初始化获得的,而初始化 gitosis ,需要 gitosis 管理服务器的 ssh 公钥。
也就是说,初始化 gitosis 时用的是谁的公钥,谁就是 gitosis 管理服务器,就能用 gitosis 管理 gitosis-admin.git 和其他放在这里的项目仓库。(不知道这样理解贴不贴切,个人觉得是这么个意思)
在这里,我直接在这台 git 服务器上生成 ssh 公钥,所以这台服务器即是 git 服务器,又是 gitosis 管理服务器。
执行命令:
ssh-keygen -t rsa
#### 这里会提示输入密码,直接留空就行,一路 enter 就行。同时你可以看到,即将生成的密钥文件的存放路径在哪,我这里是在 /home/lai/.ssh/ 文件夹,因为我当前的 linux 用户是 lai。
之后,在 /home/lai/.ssh/ 文件夹下,可以看到 id_rsa(私钥) 和 id_rsa.pub(公钥) 两个文件。
用 id_rsa.pub 公钥初始化 gitosis ,执行命令:
sudo -H -u git gitosis-init < /home/lai/.ssh/id_rsa.pub
看到以上信息,说明初始化成功了。
这时,打开 /home/gitrepo 文件夹,会发现多了一个 gitosis-admin.git 仓库。(之所以会在这里,是因为 gitosis-admin.git 仓库默认放在 /home/git/repositories 文件夹下,而 /home/git/repositories 个软链接,映射到 /home/gitrepo )
接下来,需要手工对该仓库中的 post-update 脚本加上可执行权限(这个脚本应该是用于自动更新配置的钩子):
sudo chmod 755 /home/gitrepo/gitosis-admin.git/hooks/post-update
注:如果你是手动敲上面这行命令,会发现到 hooks 时,用键盘的 Tab 快捷键不会自动补全 hooks。这是因为我当前的 linux 用户(lai)没有读 gitosis-admin.git 文件夹的权限,所以在这里,我将 gitosis-admin.git 文件夹权限改成任何用户都可读:
sudo chmod 755 /home/gitrepo/gitosis-admin.git/
以 git 账户创建一个测试项目仓库 mytest ,然后退出 git 账户:
su git
cd /home/gitrepo
mkdir mytest
git init --bare
exit
新建的 mytest 项目仓库是个“裸仓库”,是不能被客户端 clone。(更多关于 git init --bare 和 git init 的区别,请参考:git init 与 git init --bare 的区别)
接下来,需要对 gitosis 进行一些配置,使得 mytest 项目仓库可以被 gitosis 管理。
首先在 gitosis 管理服务器(也就是初始化时,用来生成 ssh 公钥的那台机,在这里,我是同一台机)将 gitosis-admin.git 仓库 clone 下来。
新建一个目录用来放 gitosis-admin.git :
cd ~
mkdir gitadmin
cd gitadmin
git clone git@(你的ip):gitosis-admin.git
看到如下信息,说明 clone 正确:
clone 下来的 gitosis-admin.git 里面,
gitosis.conf 文件,用来配置仓库、用户、权限的信息
keydir 文件夹,用于存放用户的 ssh 公钥,这些公钥一般以“用户名.pub”命名,gitosis.conf 配置文件中需使用相同用户名。
也就是说,所有需要 git 请求的客户端机器,都需要在自己机器上生成 ssh 公钥(用命令“ssh-keygen -t rsa”),
然后 gitosis 管理员再将这些公钥收集起来,统一放到 keydir 文件夹下,其中公钥的名称要以相应的用户名命名。
比如,我在本地的机器(window10)中,在 git bash 运行命令 “ssh-keygen -t rsa”生成了公钥,公钥的位置在“C:\Users\Administrator\.ssh\id_rsa.pub”,用户名为“Administrator@LAI-PC”:
那么,我就需要将本地的 id_rsa.pub 文件,复制到 gitosis 管理服务器的 /home/lai/gitadmin/gitosis-admin.git/keydir/ 文件夹下,重命名为 [email protected] :
然后,编辑 ~/gitadmin/gitosis-admin.git/gitosis.conf
cd ~/gitadmin/gitosis-admin.git
vi gitosis.conf
添加如下内容:
其中,
[group testwrite] 表示管理员组 testwrite,名字可以随意;
members 表示管理员用户名,需要在 keydir 目录下找到相应的.pub文件,多个可用空格隔开;
writable 表示可写的项目仓库名,多个可用空格隔开。
因为这些配置的修改只是在本地修改的,还需要推送到服务器中才能生效:
git add .
git commit -am '添加 mytest 项目仓库的用户权限'
git push origin master
由于后添加的用户不会马上生效,可以重启一下 sshd 服务:
sudo /etc/init.d/ssh restart
到此,git 服务端的安装和配置就完成了。
接下来,就可以在客户端机器上各自 clone 相应的项目仓库,开展相应工作了。
还记得我们前面在 git 服务端新建的裸仓库 /home/gitrepo/mytest.git 吗?
这个 mytest.git 仓库是空的,现在需要一个对此仓库有管理权限的用户,在本地初始化一个版本,并与 git 服务端 mytest.git 仓库关联起来。这样,其他用户就可以直接 clone 这个项目仓库了。
我的本本是 windows10 ,已经安装了 git for windows 。
鼠标右键,打开 git bash,在本地新建一个项目文件夹,用 git init 初始化成工作目录,然后新建一个测试文件,最后关联到 git@[你的git服务端ip]:mytest.git,操作命令如下:
mkdir testgit
cd testgit
git init
echo "这个一个测试 git 的文件" > readme.txt
git add .
git commit -am '提交 mytest 项目仓库的初始版本'
git remote add origin git@[你的git服务端ip]:mytest.git
git push origin master
这样一来,git 服务端的 mytest.git 仓库就有一个初始版本了。
之后其他用户就可以直接 clone 这个项目仓库了。
现在测试一下。进入本地另一个文件夹内,鼠标右键打开 git bash,clone 这个项目仓库:
git clone git@[你的git服务端ip]:mytest.git
再之后,就是你的编码之旅了。
如果想从本地(windows系统)通过拖拽文件的方式,通过 ssh 客户端(如 Xshell),直接将文件复制到远程服务器(ubuntu系统),可以在 ubuntu 系统中安装 lrzsz:
sudo apt-get install lrzsz
这样,就可以直接拖拽本地的 id_rsa.pub 到服务端的 keydir 文件夹下了。
以上~