首先我们要分析一下问题,实现一个Git远程仓库服务器要知道:
- 如何配置Git服务器端。
- 如何连接远程仓库。
- 如何从远程仓库push、pull、fetch等操作。
分析完发现蛮简单的,我们一步步来,首先是配置。
准备工作
由于是个人使用,就使用SSH协议来实现就好了。不过在这之前,我们有点准备工作要做。
首先我们在服务器端(也就是树莓派上)创建一个名为git
的账户来专门用作git远程仓库,并且为创建一个.ssh
目录并且修改其权限为700
,在.ssh
中使用touch
命令新建一个名为authorized_keys
的空白文件并且修改其权限为600
。命令如下:
$ sudo adduser git
$ su git
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
这里的authorized_keys
空白文件稍后有用。
然后我们回到客户端,这时候需要弄一个bare repository出来,也就是不包含当前工作目录的仓库。
我们先新建一个目录,然后将其变成git仓库。
# 创建一个名为gitproject的目录
$ mkdir gitproject
# 将工作目录切换到gitproject
$ cd gitproject
# 将其初始化为git仓库
$ git init
# 返回上级目录
$ cd ..
然后我们通过加上--bare
选项来克隆这个仓库,来得到我们需要的新的bare repository:
$ git clone --bare gitproject gitproject.git
Cloning into bare repository 'gitproject'...
done.
可以看到提示我们克隆bare repository完成了。接下来我们需要把bare repository放到服务器上,也就是要开始配置服务器了。我们使用以scp
来将刚才创建好的bare repositorygitproject.git
放到树莓派服务器上,完整命令如下:
$ scp -r my_project.git user@git.example.com:/srv/git
如果我们使用其他设备访问服务器,就能克隆这个bare repository啦。接下来就是如何连接这个仓库了,不过在这之前我们还有一些相关的准备工作要做。
这个时候会发现除了clone之外,push等操作会出问题,这是因为Git服务器通过SSH公钥进行认证,这时候我们就需要向其提供公钥。由于默认情况下,用户的SSH密钥存储在/.ssh
目录下,所以我们输入以下这些命令来查看是否已经生成了公钥:
$ cd ~/.ssh
$ ls
id_rsa id_rsa.pub known_hosts
如果显示有id_rsa
和id_rsa.pub
,那么就是已经生成了密钥(.pub后缀的是公钥,另一个是私钥)。如果没有显示这些文件,就使用ssh-keygen
创建一下(在macOS和Linux中,ssh-keygen
随SSH包提供),命令如下:
$ ssh-keygen -o
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/schacon/.ssh/id_rsa.
Your public key has been saved in /home/schacon/.ssh/id_rsa.pub.
The key fingerprint is:
# 这里显示的是密钥的指纹,最后是Git用户名
我们可以使用文本编辑器(vim、nano等)或者less、cat等命令查看~/.ssh/id_rsa.pub
来查看公钥。
配置树莓派
刚才我们搞定了需要准备的目录、文件和密钥。
但是由于我们自己就是管理员,那么我们就需要复制公钥,在服务器端(也就是树莓派上)将其添加到我们之前创建的树莓派上用户git
的authorized_keys
空白文件中,这里可以使用文本编辑器复制粘贴,也可以使用cat命令加在文件末尾。
这里可能有人会好奇如何从客户端复制文本粘贴到树莓派。我们可以使用ssh连接远程操作树莓派,详情请查看:https://blog.csdn.net/qq_33919450/article/details/122018257
这时候我们就可以在树莓派上为我们新建一个空仓库,以便等会使用。这里用git初始化仓库的需要使用git init --bare
而不是git init
,因为--bare
选项可以让初始化的时候不创建工作目录。具体命令如下:
# 由于git用户只用作远程仓库,不会导入其他程序文件等,所以我们直接在用户git的目录下操作,不放到srv目录下
# 新建一个名为project.git的目录
$ mkdir project.git
# 切换到project.git目录下
$ cd project.git
# 使用--bare选项初始化该目录
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/
我们回到本机,这时候我们就能将我们本地的Git仓库添加到树莓派上的远程仓库里了。具体命令如下(下面远程仓库地址到获取和解释请参考我的另外一篇博客https://blog.csdn.net/qq_33919450/article/details/122018257中的“获取树莓派的IP”部分):
# 切换到我们需要添加到远程仓库的项目的目录下
$ cd gitproject
# 如果打算创建一个空的,就新建一个目录后,add、commit之后,再进行着条命令
# 添加之前在树莓派上准备好的远程仓库,这里的origin将在以后指代这个远程仓库的地址,也可以理解成指代这个远程仓库
$ git remote add origin git@xxx.xxx.xxx.xxx:gitproject.git
# 将本地仓库push到远程仓库origin(指代git@xxx.xxx.xxx.xxx:gitproject.git)的master分支
$ git push origin master
这时候就算配置完远程Git仓库了。
如何操作
到时候我们就可以像GitHub一样使用了,clone、push、fetch、pull等。
这里简单讲一些常用的使用命令,例如跟踪、提交、还原)等,更多更详细的命令介绍可以看看我的另外一篇博客https://blog.csdn.net/qq_33919450/article/details/122020108:
添加远程仓库
git remote add origin git@xxx.xxx.xxx.xxx:gitproject.git
重命名远程仓库
git remote rename old_name new_name
查看远程仓库
git remote show origin
移除远程仓库
git remote remove origin
修改或者添加文件之后,跟踪这些文件
git add .
提交更新
git commit . -m 'this is comment'
查看当前仓库中的文件的状态
git status
查看更详细当前仓库中的文件的状态
$ git diff
推送更新到远程仓库
git push origin master
查看提交记录
git log