目录
步骤一.安装Git:
步骤二.服务器端创建git用户(管理Git服务)
服务器端的Git配置公钥
生成rsa证书文件
步骤三.服务器端创建Git仓库
步骤四.客户端clone服务器端git仓库
1、在客户端创建本地仓库
2、客户端创建Rsa公钥和Rsa私钥
步骤五.服务器Git打开RSA认证
1、修改sshd_config文件配置
2、重启sshd服务
3、在客户端Git Bash 下导入文件
4、设置权限(根据实际情况决定)
步骤六.客户端再次clone(测试是否需要输入密码)
安装Gitosis之管理公钥
安装Gitosis依赖的工具
进入到Gitosis目录执行:
出现下面的信息表示安装成功
禁止服务器某个用户通过ssh登录服务器
git init 和 git init --bare的区别
git init --bare 的特点
git init 的特点
git init容易产生冲突的地方
#通过yum安装Git
yum install -y git
#查看Git版本(确认是否安装成功):
git --version
- 如果不需要区分用户来管理git,则可以跳过此步骤(默认使用root用户来管理git)
#查看git用户是否存在
[root@wpl ~]# id git
id: git: no such user
#添加git用户
[root@wpl ~]# useradd git
#给git用户设置密码
[root@wpl ~]# echo "123" | passwd --stdin git
Changing password for user git.
passwd: all authentication tokens updated successfully.
#切换到git用户下
[root@wpl ~]# su - git
Last failed login: Mon Jan 16 10:13:48 CST 2023 from 10.10.10.38 on ssh:notty
There were 5 failed login attempts since the last successful login.
[git@wpl ~]$
在Windows上配置管理者,git服务器需要一些管理者,通过上传开发者机器的公钥到服务器,添加成为git服务器的管理者,打开git命令行
[root@wpl ~]# ssh-keygen -t rsa
执行完 :ssh-keygen -t rsa 结果如下图所示
- 创建Git仓库有两种方式,第一种:git init 第二种:git init --bare。
git init 和 git init --bare的区别文章最后有介绍,我这里用的是:git init --bare
#在git用户目录下创建仓库目录repositroy,并且创建project.git项目测试目录
[root@wpl home]# mkdir -p ./git/repository/project.git
#查看/home/目录下有哪些用户目录
[root@wpl home]# ll
total 4
drwx------. 7 git git 137 Jan 16 17:36 git
drwx------. 15 wpl wpl 4096 Jan 16 09:23 wpl
#进入git用户目录
[root@wpl home]# cd git/
#查看git用户目录下有哪些目录/文件
[root@wpl git]# ll
total 0
drwxr-xr-x. 3 root root 25 Jan 16 17:36 repository
#进入repository仓库目录
[root@wpl git]# cd repository/
#查看仓库目录下的项目目录
[root@wpl repository]# ll
total 0
drwxr-xr-x. 2 root root 6 Jan 16 17:36 project.git
#这步很重要,初始化项目测试目录
[root@wpl repository]# git init --bare ./project.git/
Initialized empty Git repository in /home/git/repository/project.git/
2、如果上面创建了git用户来管理git服务,则这里需要把 Git 仓库的 owner(拥有者) 修改为 git用户。执行命令:
chown -R git:git repository/
TortoiseGit的方式克隆
例如:我的本地仓库设置在:D:\PhpStudyV8\phpstudy_pro 目录下
Git Bash的方式克隆
- 在D:\PhpStudyV8\phpstudy_pro目录下打开 Git Bash
Git Bash 的操作如下:
#执行 clone 命令
EDZ@WINDOWS-6INDESP MINGW64 /d/PhpStudyV8/phpstudy_pro
$ git clone [email protected]:/home/git/repository/project.git
Cloning into 'project'...
#提示让输入密码(输入创建git用户时设置的密码即可)
[email protected]'s password:
warning: You appear to have cloned an empty repository.
#当第一次连接到目标 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
#选择yes
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
#此时 C:\Users\用户名\.ssh 下会多出一个文件 known_hosts,以后在这台电脑上再次连接目标Git服务器时不会再提示上面的语句。
Warning: Permanently added '10.10.10.68' (ED25519) to the list of known hosts.
#提示让输入密码(输入服务器root用户的密码即可)
[email protected]'s password:
此时 C:\Users\用户名\.ssh 下会多出一个文件 known_hosts文件,以后在这台电脑上再次连接目标 Git 服务器时不会再提示上面的语句。
【说明】
- 如果你的服务器没有配置SSH连接,那么按照正常情况会让你输入root用户的密码,输入正确后就能进行项目克隆了。
- 如果不采用 SSH 公钥来进行验证,则每次都要输入密码,很麻烦,下面就来配置SSH公钥验证的方式来clone项目
ssh-keygen -t rsa -C "[email protected]"
执行过程如下图所示
此时 C:\Users\用户名\.ssh 下会多出两个 id_rsa(私钥)和 id_rsa.pub(公钥) 文件
进入 /etc/ssh 目录,编辑sshd_config,查看以下三个配置是否被注释或者存在。不存在的给添加上,被注释的,就取消注释。最后 :wq 保存并退出
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
service sshd restart
sshd的相关操作命令:
- systemctl status sshd.service #查看ssh服务状态
- systemctl start sshd.service #开启ssh服务
- systemctl enable sshd.service #设置ssh服务开机自启
【AuthorizedKeysFile】配置项:是公钥的存放路径
将客户端公钥导入服务器端 .ssh/authorized_keys 文件中,执行:
#执行命令:ssh git@服务器公网IP地址 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
EDZ@WINDOWS-6INDESP MINGW64 /d/PhpStudyV8/phpstudy_pro/project (master)
$ ssh [email protected] 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
#提示让输入密码,这里输入git用户的密码即可
[email protected]'s password:
再次查看服务器:/.ssh 目录,就会发现多了一个authorized_keys文件
- 在设置权限之前先确认一下 .ssh目录和文件authorized_keys的权限,如果.ssh目录权限是:700 文件authorized_keys权限是:600,则不需要设置权限。
- 如果不是700 和 600,则执行命令:
chmod 700 /home/git/.ssh/
chmod 600 /home/git/.ssh/authorized_keys
EDZ@WINDOWS-6INDESP MINGW64 /d/PhpStudyV8/phpstudy_pro/git-one (master)
$ git clone [email protected]:/home/git/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.
这次克隆发现没有提示:是否需要继续链接,也没有提示让输入密码,直接就成功了。
- 如果团队很小,把每个人的公钥收集起来放到服务器的
.ssh/authorized_keys
文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。- 下面讲解如何安装Gitosis,这里就不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。
- 我将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下来
yum install python-setuptools -y
sudo python setup.py install
vim /etc/passwd
找到:这里写需要禁止的用户名:x:1001:1001::/home/git:/bin/bash
修改为:这里写需要禁止的用户名:x:1001:1001::/home/git:/bin/git-shell
大家都知道,初始化仓库的命令是: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"(bare汉语意思是:裸,裸的)初始化的版本库(暂且称为bare repository),会生成多个记录版本信息的文件。
- 这种方式,不会包含实际项目源文件的拷贝,所以该版本库不能称为工作目录(working tree)
查看一下刚才用 git init --bare生成的 test.git目录,结构如下
- 会生成一个.git(隐藏文件夹),在这个文件夹里面有多个版本历史记录文件。
- 使用–bare选项时,不再生成.git目录,而是只生成.git目录下面的版本历史记录文件。这些版本历史记录文件也不再存放在.git目录下面,而是直接存放在版本库的根目录下面
查看一下用 git init test_git.git生成的 test_git.git目录,结构如下
- 因为远端仓库的用户正在master的分支上操作,而你又要把更新提交到这个master分支上,当然就出错了。
- 但如果是往远端仓库中空闲的分支上提交还是可以的,比如git push origin master:b1 还是可以成功的。