声明: 本教程, 仅作为配置的记录, 细节不展开, 需要您有一点 linux 的命令基础, 仅作为配置参考.
1. 系统环境
系统: Linux:CentOS 7.2 64 位
由于 CentOS 已经内置了 OpenSSH, 如果您的系统没有, 请自行安装.
查看 ssh 版本
- $ ssh -V
- # 输出以下表示没问题, 可以继续. 版本可能不一致, 能用即可.
- OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013
避免系统环境和其他的不一致, 请核对您系统的版本, 其他发行版请对应修改.
2. 安装 git
建议以下操作都切换到 root
- # 请确保您切换到了 root 账户
- $ su root
- $ yum install -y git
- # 验证是否安装成功
- $ git --version
- # 输出如下内容表示成功:
- git version x.x.x.x
3. 添加 git 的管理的账户和设置密码
设置专门管理 git 的账号非必须, 但是建议这么操作.
- # 添加 git 账户
- $ adduser git
- # 修改 git 的密码
- $ passwd git
- # 然后两次输入 git 的密码确认后.
- # 查看 git 是否安装成功
- $ cd /home && ls -al
- # 如果已经有了 git, 那么表示成, 参考如下:
- drwxr-xr-x. 5 root root 4096 Apr 4 15:03 .
- dr-xr-xr-x. 19 root root 4096 Apr 4 15:05 ..
- drwx------ 10 git git 4096 Apr 4 00:26 git
- # 默认还给我们分配一个名字叫 git 的组.
4. git 的权限管理
git 仓库的权限管理, 我们可以手动进行管理和配置, 也可以通过其他辅助工具. 如果小团队的话, 直接通过 ssh 公钥进行管理即可, 如果大点的团队, 最好用 https://link.jianshu.com/?t=https://github.com/sitaramc/gitolite 或者 https://link.jianshu.com/?t=https://github.com/res0nat0r/gitosis , 两者都差不多, 一个是 Perl 开发, 一个是 Python 开发.
以下我分别介绍手动管理权限和使用 gitolite 管理的方式, 注意两者不兼容, 不能混用.
5. git 的手动权限管理
经过以上步骤, 其实服务器的基本已经配置好, 但是需要设置权限和配置远程访问 git 仓库的方式. 我们只介绍 ssh 的方式, https 不做介绍.
5.1 配置服务端的 ssh 访问
切换到 git 账号, 并创建 ssh 的默认目录和校验公钥的配置文件
- # 1. 切换到 git 账号
- $ su git
- # 2. 进入 git 账户的主目录
- $ cd /home/git
- # 3. 创建. ssh 的配置, 如果此文件夹已经存在请忽略此步.
- $ mkdir .ssh
- # 4. 进入刚创建的. ssh 目录并创建 authorized_keys 文件, 此文件存放客户端远程访问的 ssh 的公钥.
- $ cd /home/git/.ssh
- $ touch authorized_keys
- # 5. 设置权限, 此步骤不能省略, 而且权限值也不要改, 不然会报错.
- $ chmod 700 /home/git/.ssh/
- $ chmod 600 /home/git/.ssh/authorized_keys
此时, 服务端的配置基本完成. 接下需要把客户端的公钥拷贝到 authorized_keys 文件中.
5.2 配置客户端的 ssh 私钥并上传服务器
以下是客户端创建 ssh 私钥和拷贝的过程, 如果您有私钥越过创建私钥的过程.
请用您的客户端进入终端 (如果只有一台电脑, 可以用不同的账号模拟不同客户端)
第一步: 创建客户端的 ssh 私钥和公钥
检查是否已经拥有 ssh 公钥和私钥: 进入用户的主目录.
用户主目录:
Windows 系统: C:\Users \ 用户名
Linux 系统:/home / 用户名
Mac 系统:/Users / 用户名
然后查看是否有. ssh 文件夹, 此文件夹下是否有如下几个文件.
- # 用户主目录的. ssh 文件夹下
- .ssh
- id_rsa
- id_rsa.pub # 我们要用的私钥
如果没有, 那么用 ssh-keygen 创建 ssh 的私钥.
- $ ssh-keygen -t rsa
- # 接下来, 三个回车默认即可.
创建私钥成功后, 在查看用户目录是否有意加有了公钥文件 id_rsa.pub
第二步: 拷贝私钥到 git 的服务器
如何把客户端的文件拷贝到服务器端, 我建议用 scp 命令进行拷贝.
以下以 mac 系统为例:
- # 首先进入我的用户主目录的. ssh 目录下, 注意用户名 xxx 替换成自己的
- $ cd /Users/xxx/.ssh
- # 以下命令是: 把本地的 id_rsa.pub 文件拷贝到 aicoder.com 服务器, 登录 aicoder.com 服务的账号是 git.
- # 冒号后面默认就是 git 账号的主目录, 最后文件被保存成 laoma.pub
- # 注意: 把域名换成你自己的或者 ip, 最后的文件名可以自己定, 后面还有用.
- $ scp ./id_rsa.pub git@aicoder.com:.ssh/laoma.pub
5.3 服务器端添加客户端的 SSH 公钥
切换到服务器端, 把刚才上传的 laoma.pub 文件的内容添加到 authorized_keys 中, 就可以允许客户端 ssh 访问了.
- # 切换到 git 账户
- $ su git
- $ cd /home/git/.ssh
- $ ls -al
- # 查看一下. ssh 目录是否有 authorized_keys 和 laoma.pub 文件
- # .
- # |-- authorized_keys
- # `-- laoma.pub
- # 如果有, 那么进行下面的把 laoma.pub 文件中的内容添加到 authorized_keys 中.
- $ cat laoma.pub>> authorized_keys
- #>> 是在文件后面追加的意思, 主要如果用其他编辑器, 每个 ssh 的 pub 要单独一行, 建议用 cat 命令方便简单.
到此为止, 您配置的客户端应该可以 ssh 的方式直接用 git 账号登录服务器.(当然不安全, 后面可以控制)
- # 在客户端用 ssh 测试连接远程服务器, 请将域名 aicoder.com 换成你的 ip 地址或者域名
- $ ssh git@aicoder.com
- # 第一次连接有警告, 输入 yes 继续即可. 如果可以连接上, 那么恭喜你的 ssh 配置已经可以了.
5.4 服务器端创建测试 git 仓库
进入服务器的终端.
- # 切换到 git 账号
- $ su git
- # 进入 git 账号的用户主目录.
- $ cd /home/git
- # 在用户主目录下创建 test.git 仓库的文件夹
- $ mkdir test.git && cd test.git
- # 在 test.git 目录下初始化 git 仓库
- $ git init --bare
- # 输出如下内容, 表示成功
- Initialized empty Git repository in /home/git/test.git/
git init --bare 是在当前目录创建一个裸仓库, 也就是说没有工作区的文件, 直接把 git 仓库隐藏的文件放在当前目录下, 此目录仅用于存储仓库的历史版本等数据.
此时, 客户端就可以进行 clone 或者 remote add 此仓库了.
5.5 客户端测试连接 git 远程仓库
客户端, 可以新建一个文件夹, 初始化一个仓库, 然后跟远程服务器上的空仓库建立连接.
- # 以下 shell 代码, 纯手写没有验证, 如果有错误请自行纠正.
- $ mkdir demos && cd demos
- $ git init
- $ touch a.txt
- $ echo 'aicoder.com'>> a.txt
- $ git add .
- $ git commit -m 'the first commit'
- # 把当前仓库跟远程仓库添映射
- $ git remote add origin git@aicoder.com:test.git
- # 把当前仓库 push 到远程仓库.
- $ git push -u origin master
到此为止, 我们就可以尽情的享用 git 私服了, 但是! 但是! 但是! 客户端可以直接 ssh 登录啊, 这是 bug, 也是不安全的隐患, 且看下面怎么禁用 git 账号的 shell 登录.
5.6 禁止客户端 shell 登录
因为前面我们添加了客户端的 ssh 的公钥到远程服务器, 所以客户端可以直接通过 shell 远程登录服务器, 这不安全, 也不是我们想要的. 且看下面如何禁用 shell 登录:
第一步:
给 /home/git 下面创建 git-shell-commands 目录, 并把目录的拥有者设置为 git 账户. 可以直接用 git 账号登录服务器终端操作.
- $ su git
- $ mkdir /home/git/git-shell-commands
此文件夹是 git-shell 用到的目录, 需要我们手动创建, 不然报错: fatal: Interactive git shell is not enabled. hint: ~/git-shell-commands should exist and have read and execute access.
第二步: 修改 / etc/passwd 文件, 修改
- $ vim /etc/passwd
- # 可以通过 vim 的正则搜索快速定位到这行, 命名模式下 :/git:x
- # 找到这句, 注意 1000 可能是别的数字
- git:x:1000:1000::/home/git:/bin/bash
- # 改为:
- git:x:1000:1000::/home/git:/bin/git-shell
- # 最好不要直接改, 可以先复制一行, 然后注释掉一行, 修改一行, 保留原始的, 这就是经验!!!
- # vim 快捷键: 命名模式下: yy 复制行, p 粘贴 0 光标到行首 $ 到行位 x 删除一个字符 i 进入插入模式
- # 修改完后退出保存: esc 进入命令模式, 输入::wq! 保存退出.
好了, 此时我们就不用担心客户端通过 shell 登录, 只允许使用 git-shell 进行管理 git 的仓库.
如果有其他小伙伴要连接 git 服务器, 仅需要把他的公钥也添加到 authorized_keys 即可.
7. git 的自动权限管理: gitolite(不要跟上面的步骤混做!!!)
如果团队大点的, 我们可以用 gitolite 管理, 而且使用很方便.
7.1 gitolite 的安装和配置
以下配置此承接第 5, 如果第 6 步您已经操作, 请注意第二步的说明.
第一步: 添加 gitolite 依赖的 perl 的包
$ yum install 'perl(Data::Dumper)'
第二步: 清空服务器端配置的 ssh 的公钥
确保:
~/.ssh/authorized_keys
文件是空的, 或者不存在. 如果已经存在, 建议你把他改名即可, 比如: authorized_keys.bak
第三步: 上传管理员的客户端的 ssh 公钥到服务器
把你管理员电脑的 ssh 的 id_rsa.pub 文件拷贝到服务器的: $HOME/YourName.pub
YourName 可以自定义, 最好根据不同伙伴的名字命名.
参考:
- # mac 客户端
- $ scp /Users/fly/.ssh/id_rsa.pub git@aicoder.com:malun.pub
第四步: 安装配置 gitolite
用 git 账号登录, 并执行如下命令.
- # 切换到 git 账号
- $ su git
- # 进入 git 主目录
- $ cd /home/git
- # 下载 gitolite 的仓库
- $ git clone https://github.com/sitaramc/gitolite
- # 创建 bin 文件夹, 必须!!!
- $ mkdir -p $HOME/bin
- # 用下载下来的仓库中的 insall 执行安装操作, 指向的目录就是上一命令行创建的目录
$ ./gitolite 二进制 / install -to $HOME/bin
- # 把上传到服务器的 管理员的公钥 setup 到 gitolite 中, 注意: YourName.pub 改成你自己的文件名.
- $ ~/bin/gitolite setup -pk ~/YourName.pub
- # 此时安装配完成后, 查看 git 主目录
- $ ls /home/git
- drwxr-xr-x 7 git git 4096 Apr 3 23:50 bin # 我们创建的存放 gitolite 二进制
- drwxrwxr-x 6 git git 4096 Apr 3 23:40 gitolite
- drwx------ 6 git git 4096 Apr 3 23:52 .gitolite
- -rw------- 1 git git 7130 Apr 3 23:52 .gitolite.rc
- -rw------- 1 git git 398 Apr 3 23:39 malun.pub # 管理员的公钥
- drwxrw---- 3 git git 4096 Apr 3 23:40 .pki
- -rw------- 1 git git 19 Apr 4 00:26 projects.list # 仓库列表 (gitolite 自动创建)
- drwx------ 5 git git 4096 Apr 4 00:26 repositories # 存放所有仓库文件夹
- drwx------ 2 git git 4096 Apr 4 15:50 .ssh
- # repositories 目录下已经有了两个 git 仓库了.
- # .
- # |-- gitolite-admin.git # 管理配置权限的仓库
- # `-- testing.git # 测试仓库
好了, 到此位置, 管理员就可以直接把默认的远程管理的仓库 gitolite-admin 直接 clone 到本地进行管理 git 服务了.
第五步: 管理员在本地管理和配置服务器端的仓库
下载服务器端的远程管理仓库
- # 下载远程管理仓库, 请把 aicoder.com 换成你自己服务器的域名或者 ip
- $ git clone git@aicoder.com:gitolite-admin
- $ cd gitolite-admin
- # 目录结构如下:
- # .
- # conf # 配置文件夹
- # gitolite.conf # 配置权限的文件
- # keydir # 客户端的公钥文件夹, 所有伙伴的公钥要放到此目录下
- # malun.pub
7.2 gitolite 的权限配置
添加其他开发的小伙伴
把小伙伴的公钥发给管理员. 管理员添加到 gitolite-admin 仓库的 keydir 目录下, 注意文件名字格式为 username.pub,username 就是配置权限时的用户名.
配置用户对仓库的读写权限
直接修改 conf 文件夹下的, gitolite.conf 文件. 简单解释下几个用法:
repo 代表仓库的意思, 如果新添加一个 repo, 代表服务端新建一个空仓库, 仓库 push 到服务端后会自动创建.
RW 代表可读可写
@all 代表所有人.
master 和 dev 代表分支
参考:
- @admin = malun
- @om = malun bcd
- repo gitolite-admin
- RW+ = malun
- repo testing
- RW+ = @all
- repo om
- RW+ = @admin
- RW+ master = @admin
- RW+ dev = @om
应用修改到服务器端
做好配置后, 由管理员把修改 push 到服务器端, 会自动处理.
- $ git add conf
- $ git add keydir
- $ git commit -m "added foo, gave access to alice, bob, carol"
- $ git push
此时登录服务端, 查看
/home/git/repositories/
目录下是否增加了对应的仓库了呢?
总结
其实配置这些并不繁琐, 但是需要你有一定的 linux 的经验, 当然你也可以选择使用 GitLab 或者 Github.
最后希望能帮到你.
参考:
git 服务器搭建及 gitolite 权限管理 https://link.jianshu.com/?t=https://blog.csdn.net/redstarofsleep/article/details/45092135
1.Centos 搭建 Git 服务器和 Gitolite 权限设置 https://link.jianshu.com/?t=http://ju.outofmemory.cn/entry/223622
1.Linux 使用 Gitolite 架設 Git Server https://link.jianshu.com/?t=https://blog.longwin.com.tw/2011/03/linux-gitolite-git-server-2011/
aicoder.com 是老马亲自带的线下全栈实习 https://link.jianshu.com/?t=http://aicoder.com
老马免费视频教程 https://link.jianshu.com/?t=https://qtxh.ke.qq.com
来源: https://www.cnblogs.com/fly_dragon/p/8718614.html