Web服务器06 Git仓库配置
本文最后更新于:2024年12月15日 下午
本文介绍了如何在服务器上创建自己的git仓库,并把本地代码推送到远程。
Git 仓库配置
Git 远程仓库配置
在自己的服务器上搭建 git 仓库服务器(本地推送到远程仓库、远程仓库推送到本地)_git 分支推送仓库-CSDN 博客
远程仓库初始化
服务器端创建非 root 用户(可跳过)
如果自己是 root 用户,为安全,建议创建新的非 root 用户。如果自己本身是非 root 用户,可跳过
创建用户组 git,然后创建用户 git,并设置密码
1 |
|
创建新用户时,有时会遇到登录异常的问题,这是因为没有 bash
1
/usr/bin/xauth: timeout in locking authority file /home/git/.Xauthority
解决方法:首先新建该用户的 home 目录(例如
/home/git
),设置 home 目录所属为 git
1
2
cd /home
chown git:git -R git然后添加用户的 bash
1
usermod -s /bin/bash git
服务器端初始化裸仓库
在服务器上初始化 git 裸仓库
1 |
|
git init
:创建标准 Git 仓库
git init --bare <name>.git
:创建裸仓库裸仓库没有工作空间,不保存代码,只保存提交记录。详见后面知识点
如果当前是 root 用户,还需要更改所有权,更改为登录时的用户
1 |
|
chown <group>:<user> <file>
:更改<file>
的所有权。此处更改为 git 组的 git 用户。添加-R
可递归应用于子目录
服务器端布置钩子(hook)
钩子:位于
hooks
目录,存放用于处理push
事件的回调函数
为了让远程也能显示代码,需要给裸仓库添加 hook 指令,使其接收提交后将代码推送到工作空间
主要步骤为
- 添加
post-receive
- 创建文件,添加内容
- 修改权限
chmod
和所有权chown
- 创建工作空间
- 创建目录
- 修改权限
添加 post-receive
文件,放在该目录下
1 |
|
<...>
替换为实际路径
post-receive
文件内容为
1 |
|
注意这里要填写的 branch_name
表示当接收到 push 后,服务器会强制切换到 branch_name
分支,即 code
目录下会有内容
git checkout -f
用于切换分支,即将代码显示到工作区(工作空间)如果不填写 branch_name,会默认切换到 master 分支,此时即使推送的是 feature 分支,服务器上显示的代码仍然是 master
然后给 post-receive
添加可执行权限,修改所有权(可选)
1 |
|
创建工作空间。新建 code 目录(用于存放代码),设置权限为 777
1 |
|
此时会看到
/<...>/projects/hw03/code
的权限为drwxrwxrwx
,即任何人可读写
之后,用户用 push 提交后,远程仓库接收 post,执行 post-receive 命令,就可以在工作空间看到用户提交的具体内容
本地仓库设置
情况 1:本地没有 git 仓库
如果本地没有 git 仓库,需要初始化
1 |
|
此时会在当前目录下生成
.git
目录
添加远程仓库
1 |
|
<remote>
,远程仓库名,自己随便取(默认为origin
)
<user>
,用户名,例如git
<ip>
更改为实际 IP
<port>
端口
<git_dir>
更改为实际路径,例如/<...>/projects/hw03/hw03.git
情况 2:本地仓库是从别处 clone 的
在本地计算机上,清除原远程仓库(github 仓库),改为自己服务器的仓库
1 |
|
如果远程端口号出错,也需要用上述方法重新添加一次远程仓库
推送
本地推送方式
本地执行,加入暂存区,提交,推送
1 |
|
-m
表示 message,即添加备注信息
git push -u <remote> <branch>
,向远程仓库<remote>
推送<branch>
分支,remote
默认为origin
git push 参数解释:
-f 覆盖
origin: remote name,远程仓库的名字
branch_name: 将本地的 branch_name 分支推送到远程。如果远程有同名分支,会同步,如果远程没有,会自动创建并同步
推送代码后自动重启服务器(TODO)
未完成。
通过在 post-receive 中添加命令实现
期间遇到问题,发现用 git 账户启动服务器失败。
排查:用 git 账户登录,输入以下命令
1 |
|
发现报错 no module named flask
,这是因为 git 用户的环境变量跟 root 不同
SSH 免密登录
本地生产公钥
确保本地已经设置用户名和邮箱
1 |
|
生产 ssh 公钥,在 git bash 中输入
1 |
|
如果提示要生成的文件的名字,直接用默认位置和默认名 id_rsa,不然后面会出问题
将生成的 id_rsa 和 id_rsa.pub 放在 C:\Users\xxx\.ssh
下
服务器 git 用户的 home 目录下设置公钥
新建.ssh,进入.ssh
1 |
|
添加 authorized_keys
文件,里面保存 windows 电脑的 ssh 公钥(位于 C:\Users\xxx\.ssh
),一行一个
1 |
|
设置.ssh 所属用户为 git
1 |
|
常见问题
推送失败 Could not read from remote repository
报错 fatal: Could not read from remote repository
1 |
|
首先检查能否 ping 通,然后检查 SSH 能否连接(IP、端口是否正确)
尝试连接并行计算课程的超算,出现该错误,原来是 IP 错误(没有及时 rename session)
更改 IP 后仍然不行,原来是并行计算课程的 ssh 端口为 3330 而不是 22
推送了但是远程 code 没有更新
检查 git push -u origin <branch_name> -f
的 branch_name 是否正确,是否为自己工作的分支
检查远程 post-receive
文件的参数
1 |
|
看 branch_name
是否正确,如果是 master,则每次远程都会强制更新为 master 分支
ssh 免密登录失败
最后发现是服务器没有启用 PubkeyAuthentication
1 |
|
gitignore 不起作用
之前不小心把 sqlite.db 提交上去了,中途在 gitignore 中添加 sqlite.db,发现后续提交时仍然会修改 sqlite.db,导致数据库被覆盖
这是因为已经缓存了
Git 知识点
git init 和 git init --bare
Git init 和 Git init --bare 的区别,以及 Git init --bare 如何创建工作空间-腾讯云开发者社区-腾讯云
标准仓库
在某目录下执行 git init
,可以建立标准 Git 仓库,其下有 .git
目录
裸仓库
在某目录下执行 git init --bare
,可以建立“裸”Git 仓库,其项目目录下就是标准仓库中 .git
目录里的内容,没有工作空间。
这个仓库只保存 git 历史提交的版本信息,而不允许用户在上面进行各种 git 操作(如:push
、commit
操作)。但是,你依旧可以使用 git show
命令查看提交内容:
标准仓库和裸仓库的对比
git init
适用于本地仓库初始化,有完整的 Git 命令集,可提交工作空间的代码和文件
git init --bare
适用于远程仓库初始化,没有 工作空间,只提供版本管理的 Git,更方便团队协作(?)
裸仓库创建工作空间
配合 hook,可以在裸仓库创建工作空间。
Hooks
Git 钩子(hooks)是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。
post-receive
post-receive bash 脚本文件,在推送操作成功后调用