Web服务器06 Git仓库配置

本文最后更新于:2024年12月15日 下午

本文介绍了如何在服务器上创建自己的git仓库,并把本地代码推送到远程。

Git 仓库配置

Git 远程仓库配置

在自己的服务器上搭建 git 仓库服务器(本地推送到远程仓库、远程仓库推送到本地)_git 分支推送仓库-CSDN 博客

使用 git 在服务器上部署 git 仓库并实现提交代码时同步代码到生产环境 - 浅笑 19 - 博客园

远程仓库初始化

服务器端创建非 root 用户(可跳过)

如果自己是 root 用户,为安全,建议创建新的非 root 用户。如果自己本身是非 root 用户,可跳过

创建用户组 git,然后创建用户 git,并设置密码

1
2
3
groupadd git
useradd git -g git
passwd git

创建新用户时,有时会遇到登录异常的问题,这是因为没有 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
2
3
4
cd /<your_directory>/projects/
mkdir hw03
cd hw03
git init --bare hw03.git

git init:创建标准 Git 仓库

git init --bare <name>.git:创建裸仓库

裸仓库没有工作空间,不保存代码,只保存提交记录。详见后面知识点

如果当前是 root 用户,还需要更改所有权,更改为登录时的用户

1
2
cd ..
chown -R git:git hw03 # 如果当前是root用户,需要执行该操作

chown <group>:<user> <file>:更改 <file> 的所有权。此处更改为 git 组的 git 用户。添加 -R 可递归应用于子目录

服务器端布置钩子(hook)

钩子:位于 hooks 目录,存放用于处理 push 事件的回调函数

二、Git 服务器搭建 post-receive Hooks 钩子部署服务端代码-CSDN 博客

为了让远程也能显示代码,需要给裸仓库添加 hook 指令,使其接收提交后将代码推送到工作空间

主要步骤为

  • 添加 post-receive
    • 创建文件,添加内容
    • 修改权限 chmod 和所有权 chown
  • 创建工作空间
    • 创建目录
    • 修改权限

添加 post-receive 文件,放在该目录下

1
2
cd /<...>/projects/hw03/hw03.git/hooks/
vi post-receive

<...> 替换为实际路径

post-receive 文件内容为

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh

project_dir="/<...>/projects/hw03"
worktree_folder="code"
git_folder="hw03.git"
branch_name="feature"
worktree_dir="${project_dir}/${worktree_folder}"
git_dir="${project_dir}/${git_folder}"
git --work-tree="${worktree_dir}" --git-dir="${git_dir}" checkout -f "${branch_name}"

# 远程使用 git checkout -f <branch-name> 表示放弃未提交的更改,强制切换到 <branch-name> 分支
# 如果<branch-name>为空,默认为 master

注意这里要填写的 branch_name 表示当接收到 push 后,服务器会强制切换到 branch_name 分支,即 code 目录下会有内容

git checkout -f 用于切换分支,即将代码显示到工作区(工作空间)

如果不填写 branch_name,会默认切换到 master 分支,此时即使推送的是 feature 分支,服务器上显示的代码仍然是 master

然后给 post-receive 添加可执行权限,修改所有权(可选)

1
2
chmod +x post-receive
chown git:git post-receive # 仅在root下才需要

创建工作空间。新建 code 目录(用于存放代码),设置权限为 777

1
2
3
4
cd /<...>/projects/hw03
mkdir code
cd ..
chmod 777 -R code

此时会看到 /<...>/projects/hw03/code 的权限为 drwxrwxrwx,即任何人可读写

之后,用户用 push 提交后,远程仓库接收 post,执行 post-receive 命令,就可以在工作空间看到用户提交的具体内容

本地仓库设置

情况 1:本地没有 git 仓库

如果本地没有 git 仓库,需要初始化

1
git init

此时会在当前目录下生成 .git 目录

添加远程仓库

1
2
git remote add <remote> ssh://<user>@<ip>:<port><git_dir>
# 例如 git remote add origin ssh://aaaaa@114.514.1.810:22/home/aaaaa/projects/hw03/hw03.git

<remote>,远程仓库名,自己随便取(默认为 origin

<user>,用户名,例如 git

<ip> 更改为实际 IP

<port> 端口

<git_dir> 更改为实际路径,例如 /<...>/projects/hw03/hw03.git

情况 2:本地仓库是从别处 clone 的

在本地计算机上,清除原远程仓库(github 仓库),改为自己服务器的仓库

1
2
3
git remote -v # 查看现有的远程仓库 显示为github
git remote rm origin # 删除现有的远程仓库"origin"
git remote add <remote> ssh://<user>@<ip>:<port><git_dir> # 新建远程仓库"<remote>"(例如"origin")

如果远程端口号出错,也需要用上述方法重新添加一次远程仓库

推送

本地推送方式

本地执行,加入暂存区,提交,推送

1
2
3
4
5
git add --all
git commit -m "备注"
git push -u origin <branch_name> -f
# 如果端口和地址访问正常的话。应该会提示让你输入密码。你就输入上面设置的gits的密码即可开始同步
# 如果你目录权限和ssh公钥都配置正确的话 第一次推送只需要确认一下改服务器ip是否可以推送即可如果还是需要输入密码那就是目录权限或者ssh公钥的问题了

-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
python3.7 myapp.py 80

发现报错 no module named flask,这是因为 git 用户的环境变量跟 root 不同

SSH 免密登录

本地生产公钥

确保本地已经设置用户名和邮箱

1
2
3
4
git config --list
# 我这里显示
# user.name=OliveTIen
# user.email=xxxxxxxxx@qq.com

生产 ssh 公钥,在 git bash 中输入

1
ssh-keygen -t rsa -C xxxxxxxxx@qq.com

如果提示要生成的文件的名字,直接用默认位置和默认名 id_rsa,不然后面会出问题

将生成的 id_rsa 和 id_rsa.pub 放在 C:\Users\xxx\.ssh

服务器 git 用户的 home 目录下设置公钥

新建.ssh,进入.ssh

1
2
3
cd /home/git
mkdir .ssh
cd .ssh

添加 authorized_keys 文件,里面保存 windows 电脑的 ssh 公钥(位于 C:\Users\xxx\.ssh),一行一个

1
vi authorized_keys

设置.ssh 所属用户为 git

1
2
cd ..
chown -R git:git .ssh

常见问题

推送失败 Could not read from remote repository

报错 fatal: Could not read from remote repository

1
2
Connection timed out
fatal: Could not read from remote repository.

首先检查能否 ping 通,然后检查 SSH 能否连接(IP、端口是否正确)

尝试连接并行计算课程的超算,出现该错误,原来是 IP 错误(没有及时 rename session)

更改 IP 后仍然不行,原来是并行计算课程的 ssh 端口为 3330 而不是 22

推送了但是远程 code 没有更新

检查 git push -u origin <branch_name> -f 的 branch_name 是否正确,是否为自己工作的分支

检查远程 post-receive 文件的参数

1
git --work-tree="${worktree_dir}" --git-dir="${git_dir}" checkout -f "${branch_name}"

branch_name 是否正确,如果是 master,则每次远程都会强制更新为 master 分支

ssh 免密登录失败

最后发现是服务器没有启用 PubkeyAuthentication

SSH 免密登录(设置后仍需输入密码的原因及解决方法)_windows ssh 免密还要输入密码-CSDN 博客

1
cat /etc/ssh/sshd_config

gitignore 不起作用

之前不小心把 sqlite.db 提交上去了,中途在 gitignore 中添加 sqlite.db,发现后续提交时仍然会修改 sqlite.db,导致数据库被覆盖

浅析.gitignore 文件不起作用的原因及其解决办法 - 古兰精 - 博客园

这是因为已经缓存了

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 操作(如:pushcommit 操作)。但是,你依旧可以使用 git show 命令查看提交内容:

标准仓库和裸仓库的对比

git init 适用于本地仓库初始化,有完整的 Git 命令集,可提交工作空间的代码和文件

git init --bare 适用于远程仓库初始化,没有 工作空间,只提供版本管理的 Git,更方便团队协作(?)

裸仓库创建工作空间

配合 hook,可以在裸仓库创建工作空间。

Hooks

【译文】Git Hooks(钩子)精讲 | Hoooo 同学的博客

Git 钩子(hooks)是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。

post-receive

post-receive bash 脚本文件,在推送操作成功后调用


Web服务器06 Git仓库配置
http://olivetien.github.io/03-05-web/WebServer06-GitRepository/
作者
Anonymous
发布于
2024年12月15日
许可协议