目录
步骤一.安装Git:
步骤二.安装Gitosis
安装Gitosis依赖的工具
进入到Gitosis目录执行:
出现下面的信息表示安装成功
步骤三.服务器端创建git用户来管理Git服务
服务器端的Git配置公钥
步骤四.服务器端创建Git仓库
步骤五.客户端clone服务器端git仓库
1、在客户端创建本地仓库
2、客户端创建公钥和私钥
步骤六.服务器Git打开RSA认证
1、修改sshd_config文件配置
2、重启sshd服务
3、在客户端Git Bash 下导入文件
4、设置权限
步骤七.禁止Git用户通过ssh登录服务器
步骤八.客户端测试clone服务器端仓库
git init 和 git init --bare的区别
git init --bare 的特点
git init 的特点
git init容易产生冲突的地方
管理公钥
步骤一.安装Git:
#通过yum安装Git
yum install -y git
#查看Git版本(确认是否安装成功):
git --version
步骤二.安装Gitosis(不需要使用Gitosis的可以跳过此步骤)
我将Gitosis安装到在 /opt目录下了,Linux:opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。当然也可以根据自己习惯,决定安装到那个目录。
git clone https://github.com/res0nat0r/gitosis.git
执行:git clone https://github.com/res0nat0r/gitosis.git 命令遇到的错误
- 错误提示:fatal: unable to access 'https://github.com/res0nat0r/gitosis.git/': Encountered end of file 的错误,下面说一下解决方法。
第一种方法:依次执行下面的命令
- git config --global --unset http.proxy
- git config --global --unset https.proxy
第二种方法:尝试将目标地址中的 https 改为 git
如果以上两种方式还是不行,那就还使用原命令多尝试克隆几次。我都尝试了好几次,才clone下来
-
安装Gitosis依赖的工具
yum install python-setuptools -y
-
进入到Gitosis目录执行:
sudo python setup.py install
-
出现下面的信息表示安装成功
步骤三.服务器端创建git用户来管理Git服务
#查看Git用户是否存在
[root@wpl gitosis]# id git
id: git: no such user 提示没有这样的用户
#创建Git用户(用来运行git服务)
[root@wpl gitosis]# useradd git
#给Git用户设置密码
[root@wpl gitosis]# echo "123" | passwd --stdin git
Changing password for user git.
passwd: all authentication tokens updated successfully.
#切换到Git用户下
[root@wpl gitosis]# su - git
-
服务器端的Git配置公钥
在Windows上配置管理者,git服务器需要一些管理者,通过上传开发者机器的公钥到服务器,添加成为git服务器的管理者,打开git命令行
- 生成rsa证书文件
[git@wpl ~]$ ssh-keygen -t rsa
执行完 :ssh-keygen -t rsa 结果如下图所示
步骤四.服务器端创建Git仓库
1、设置 /home/git/test.git 为 Git 仓库
git init --bare ./test.git
2、然后把 Git 仓库的 owner(拥有者) 修改为 git用户,执行命令:
chown -R git:git test.git/
步骤五.客户端clone服务器端git仓库
-
1、在客户端创建本地仓库
- 例如我的本地仓库设置在:D:\PhpStudyV8\phpstudy_pro\git-one 目录
- 通过Git Bash 进入到D:\PhpStudyV8\phpstudy_pro\git-one 目录中
- 在D:\PhpStudyV8\phpstudy_pro\git-one目录中的操作如下
#执行 git init 命令初始化本地仓库
EDZ@WINDOWS-6INDESP MINGW64 /d/PhpStudyV8/phpstudy_pro/git-one
$ git init
Initialized empty Git repository in D:/PhpStudyV8/phpstudy_pro/git-one/.git/
#执行 clone 命令,克隆服务器端的仓库
#10.10.10.68是服务器的ip
#/home/git/test.git 是服务器端仓库的路径
EDZ@WINDOWS-6INDESP MINGW64 /d/PhpStudyV8/phpstudy_pro/git-one (master)
$ git clone git@10.10.10.68:/home/git/test.git
#当第一次连接到目标 Git 服务器时会提示
Cloning into 'test'...
The authenticity of host '10.10.10.68 (10.10.10.68)' can't be established.
ED25519 key fingerprint is SHA256:DSWcndKXrWJcGFVHIgiMKg9RBc9JHyqMI6R/eCchszw.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
#输入:yes 会提示
Warning: Permanently added '10.10.10.68' (ED25519) to the list of known hosts.
git@10.10.10.68's password:
此时 C:\Users\用户名\.ssh 下会多出一个文件 known_hosts文件,以后在这台电脑上再次连接目标 Git 服务器时不会再提示上面的语句。
【说明】
- 如果你的服务器没有配置SSH连接,那么按照正常情况会让你输入git用户的密码,输入正确后就能进行项目克隆了。
- 如果不采用 SSH 公钥来进行验证,则每次都要输入密码,很麻烦,下面就来配置SSH公钥验证的方式来clone项目
-
2、客户端创建公钥和私钥
ssh-keygen -t rsa -C "123456@163.com"
执行过程如下图所示
此时 C:\Users\用户名\.ssh 下会多出两个 id_rsa(私钥)和 id_rsa.pub(公钥) 文件
步骤六.服务器Git打开RSA认证
-
1、修改sshd_config文件配置
进入 /etc/ssh 目录,编辑sshd_config,查看以下三个配置是否被注释或者存在。不存在的给添加上,被注释的,就取消注释。最后 :wq 保存并退出
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
-
2、重启sshd服务
service sshd restart
sshd的相关操作命令:
- systemctl status sshd.service #查看ssh服务状态
- systemctl start sshd.service #开启ssh服务
- systemctl enable sshd.service #设置ssh服务开机自启
由 【AuthorizedKeysFile】配置项,得知公钥的存放路径是 .ssh/authorized_keys,由于管理 git 服务的用户是 git,所以实际存放公钥的路径是 /home/git/.ssh/authorized_keys
-
3、在客户端Git Bash 下导入文件
将客户端公钥导入服务器端 /home/git/.ssh/authorized_keys 文件中,执行:
#执行命令ssh git@服务器公网IP地址 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
EDZ@WINDOWS-6INDESP MINGW64 /d/PhpStudyV8/phpstudy_pro/git-one (master)
$ ssh git@10.10.10.68 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
#提示输入密码,这里输入服务器端创建git用户时,给Git用户设置的密码即可(123)
git@10.10.10.68's password:
再次查看 服务器:/home/git/.ssh 目录,就会发现多了一个authorized_keys文件
-
4、设置权限
设置权限步骤不能省略,而且权限值也不要改,不然会报错。
chmod 700 /home/git/.ssh/
chmod 600 /home/git/.ssh/authorized_keys
步骤七.禁止Git用户通过ssh登录服务器
在【步骤四】中创建的Git用户,是可以通过ssh直接登陆服务器的。这样对服务器而言,就不安全了,所以咱们要禁止Git用户登录。
vim /etc/passwd
找到:git:x:1001:1001::/home/git:/bin/bash
修改为:git:x:1001:1001::/home/git:/bin/git-shell
此时 git 用户可以正常通过 ssh 使用 git,但无法通过 ssh 登录系统。
步骤八.客户端测试clone服务器端仓库
EDZ@WINDOWS-6INDESP MINGW64 /d/PhpStudyV8/phpstudy_pro/git-one (master)
$ git clone git@10.10.10.68:/home/git/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.
这次克隆发现没有提示:是否需要继续链接,也没有提示让输入密码,直接就成功了。
git init 和 git init --bare的区别
大家都知道,初始化仓库的命令是:git init,但是这里初始化仓库的命令是 git init --bare。这两者的区别
git init 创建的工作仓库(working repository)适合于实际编辑生产过程中,在工作目录下,你将可以进行实际的编码、文件管理操作和保存项目在本地工作。如果你开始创建一个项目将包含有源代码和版本跟踪记录的时候你可以使用”git init”,如果你克隆”git clone”一个已经存在的版本库的时候,你也可以得到一个working repository,它也将包含”.git”目录和源文件的拷贝。(也就是说,在远程仓库上,代码是否需要编辑和执行,如果需要执行,就使用git init)
git init --bare创建的裸仓库(bare repository)主要是用作分享版本库。开发者使用bare repository可以向其他人分享存储在本地的版本库,以便于实时分享代码更新和团队协作 。通过使用”git push”命令,你可以将你的本地更新提交至“中心版本库”(其他开发者可访问的中心库)。其他开发者可以使用“git pull”命令接受你提交的版本更新。如果你正在一个多人协作的项目团队或者同一个项目需要在不同电脑上面完成的时候,bare repository可以满足你的分布式开发需求。(也就是说,大家都把内容分享到中心仓库,然后每个人都可以获取其他人的修改信息的过程,但中心仓库没有代码文件)
-
git init --bare 的特点
- 使用命令"git init --bare"(bare汉语意思是:裸,裸的)初始化的版本库(暂且称为bare repository),会生成多个记录版本信息的文件。
- 这种方式,不会包含实际项目源文件的拷贝,所以该版本库不能称为工作目录(working tree)
查看一下刚才用 git init --bare生成的 test.git目录,结构如下
-
git init 的特点
- 会生成一个.git(隐藏文件夹),在这个文件夹里面有多个版本历史记录文件。
- 使用–bare选项时,不再生成.git目录,而是只生成.git目录下面的版本历史记录文件。这些版本历史记录文件也不再存放在.git目录下面,而是直接存放在版本库的根目录下面
查看一下用 git init test_git.git生成的 test_git.git目录,结构如下
-
git init容易产生冲突的地方
- 因为远端仓库的用户正在master的分支上操作,而你又要把更新提交到这个master分支上,当然就出错了。
- 但如果是往远端仓库中空闲的分支上提交还是可以的,比如git push origin master:b1 还是可以成功的。
管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys
文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
上面已经讲解如何安装Gitosis,这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。