ubuntu搭建git服务器及配置

链接到服务器这些就不说了,这些都是提前配置好服务器并连接,这里用的是ubuntu做为服务器

所有的操作都是在root权限下使用

安装GIT,以及添加GIT管理用户账号

安装GIT需要的组件

  1. 安装 openssh,命令如下:
1
sudo apt-get install openssh-server -y
  1. 安装完成之后,查看ssh服务是否启动,命令如下:
1
ps -e|grep ssh

从源代码安装GIT

  1. 如果您确实想从源代码安装 Git,则需要具有 Git 所依赖的以下库:autotools、curl、zlib、openssl、expat 和 libiconv。
1
2
sudo apt-get install dh-autoreconf libcurl4-gnutls-dev libexpat1-dev \
gettext libz-dev libssl-dev -y

点击参考源可查看:

  1. 为了能够添加各种格式(doc,html,info)的文档,需要这些额外的依赖项:
1
sudo apt-get install asciidoc xmlto docbook2x -y

点击参考源可查看:

  1. 如果您使用基于 Debian 的发行版(Debian / Ubuntu / Ubuntu-derivatives),您还需要以下软件包install-info
1
sudo apt-get install install-info

点击参考源可查看:

创建一个用户名,管理GIT项目

git 是用户名,可以创建自己喜欢的用户名,可以设置别的名字

1
adduser git

给git用户添加文件的写权限

  1. 使用vim编辑/etc/sudoers (如果第3步设置了别的用户名,那么这里也需要设置别的用户明)
1
vim /etc/sudoers
  1. 找到User privilege specification部分,添加如下内容:
1
git    ALL=(ALL:ALL) ALL

如下图所示:

ubuntu添加用户.png

  1. 在Ubuntu 24.04中,你可以通过添加用户到sudoers.d目录来赋予该用户sudo权限。这里是如何做的:

  2. 进入目录/etc/sudoers.d、创建一个新的用户条目文件、打开文件,添加一个新的条目来赋予用户sudo权限。在本文中username就是你创建的用户名,既git

    1
    2
    3
    cd /etc/sudoers.d
    sudo touch username
    sudo vim username

    也可以通过如下方式创建该文件:

    1
    sudo nano /etc/sudoers.d/username
  3. 例如,如果你想要给用户名为username的用户sudo权限,可以添加以下内容:

    1
    username ALL=(ALL:ALL) ALL
  4. 修改文件权限

1
chmod 0440 username

检查Ubuntu中sudoers或sudoers.d中的文件夹语法

  1. 输入以下命令检查sudoers文件的语法是否正确:
1
sudo visudo -c
  1. 如果出现语法错误提示,可以使用编辑器来修改上面对应文件
1
sudo visudo #可以使用该这个编辑也可以使用 vim vi 等软件编辑
  1. 重新检查文件的语法是否正确;

重新加载

重启吧,最简单了,如下都是重启指令

1
sudo reboot
1
sudo shutdown -r now
1
sudo init 6

安装GIT

1
apt-get install git-core

安装自动更新程序

Ubuntu 18.04 官方源的 Git 版本为 2.17.x,需通过官方 PPA 升级(源码编译兼容性差,优先 PPA):

步骤 1:安装 PPA 依赖

1
2
3
# 18.04需先安装添加PPA的工具
sudo apt update
sudo apt install -y software-properties-common apt-transport-https ca-certificates

步骤 2:添加 Git 官方 PPA 源

1
2
3
4
# 添加git-core官方PPA(18.04兼容)
sudo add-apt-repository -y ppa:git-core/ppa
# 更新源缓存(解决18.04 PPA源密钥验证问题)
sudo apt update

步骤 3:升级 Git 到最新版

1
2
3
4
5
# 升级Git(18.04下会从2.17.x升级到2.45+)
sudo apt upgrade -y git

# 验证版本(正常输出:git version 2.45.x)
git --version

Git 自动更新配置

查看版本信息

1
lsb_release  -a
1
2
3
4
Ubuntu 18.04 → bionic
Ubuntu 20.04 → focal
Ubuntu 22.04 → jammy
Ubuntu 24.04 → noble

自动更新配置

18.04 的unattended-upgrades需适配旧版规则,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 确保自动更新服务安装 安装自动更新工具的命令
sudo apt install -y unattended-upgrades

# 2. 创建Git独立自动更新配置文件
sudo tee /etc/apt/apt.conf.d/60-git-auto-upgrade << 'EOF'
# Git自动更新(Ubuntu 18.04 bionic)
Unattended-Upgrade::Allowed-Origins {
"ppa.launchpad.net/git-core/ppa/ubuntu bionic main";
};
# 仅更新Git相关包
Unattended-Upgrade::Package-Whitelist {
"^git$";
"^git-core$";
"^git-man$";
};
# 关闭不必要的自动重启(18.04 Git无服务)
Unattended-Upgrade::Automatic-Reboot "false";
EOF

# 3. 启用并重启服务
sudo systemctl enable --now unattended-upgrades
sudo systemctl restart unattended-upgrades

20.04 的unattended-upgrades需适配旧版规则,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 确保自动更新服务安装 安装自动更新工具的命令
sudo apt install -y unattended-upgrades

# 2. 创建Git独立自动更新配置文件
sudo tee /etc/apt/apt.conf.d/60-git-auto-upgrade << 'EOF'
# Git自动更新(Ubuntu 20.04 bionic)
Unattended-Upgrade::Allowed-Origins {
"ppa.launchpad.net/git-core/ppa/ubuntu focal main";
};
# 仅更新Git相关包
Unattended-Upgrade::Package-Whitelist {
"^git$";
"^git-core$";
"^git-man$";
};
# 关闭不必要的自动重启(20.04 Git无服务)
Unattended-Upgrade::Automatic-Reboot "false";
EOF

# 3. 启用并重启服务
sudo systemctl enable --now unattended-upgrades
sudo systemctl restart unattended-upgrades

22.04 的unattended-upgrades需适配旧版规则,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1. 确保自动更新服务安装 安装自动更新工具的命令
sudo apt install -y unattended-upgrades

# 2. 创建Git独立自动更新配置文件
sudo tee /etc/apt/apt.conf.d/60-git-auto-upgrade << 'EOF'
# 仅保留Git自动更新的核心规则,移除所有可能冲突的写法
Unattended-Upgrade::Origins-Pattern {
"origin=LP-PPA-git-core";
};
Unattended-Upgrade::Package-Whitelist {
"^git$";
"^git-core$";
"^git-man$";
};
Unattended-Upgrade::Automatic-Reboot "false";
EOF

# 3. 启用并重启服务
sudo systemctl enable --now unattended-upgrades
sudo systemctl restart unattended-upgrades

24.04 的unattended-upgrades需适配旧版规则,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1. 确保自动更新服务安装 安装自动更新工具的命令
sudo apt install -y unattended-upgrades

# 2. 创建Git独立自动更新配置文件
sudo tee /etc/apt/apt.conf.d/60-git-auto-upgrade << 'EOF'
# Git自动更新(Ubuntu 24.04 noble,适配最新语法)
# 核心:用"origin:"匹配PPA源,而非直接写源地址
Unattended-Upgrade::Origins-Pattern {
"origin=LP-PPA-git-core,archive=noble";
};
# 仅更新Git相关包
Unattended-Upgrade::Package-Whitelist {
"^git$";
"^git-core$";
"^git-man$";
};
# 关闭自动重启(Git无服务)
Unattended-Upgrade::Automatic-Reboot "false";
EOF

# 3. 启用并重启服务
sudo systemctl enable --now unattended-upgrades
sudo systemctl restart unattended-upgrades

验证自动更新是否生效

1
2
3
4
5
# 模拟执行自动更新(仅检查,不实际安装)
sudo unattended-upgrade --dry-run --debug | grep git

# 查看自动更新日志(确认是否有Git更新记录)
grep -i git /var/log/unattended-upgrades/unattended-upgrades.log

正常输出示例(无报错,识别 Git 源):

1
2
3
4
5
Allowed origins are: o=Ubuntu,a=noble, o=Ubuntu,a=noble-security, o=UbuntuESMApps,a=noble-apps-security, o=UbuntuESM,a=noble-infra-security, o=nginx.org,a=noble, origin=LP-PPA-git-core,archive=noble
Initial whitelist (not strict): ^git$ ^git-core$ ^git-man$ ^nginx$ ^nginx-core$ ^nginx-common$
Applying pinning: PkgPin(pkg='/^^git$/', priority=900)
Applying pinning: PkgPin(pkg='/^^git-core$/', priority=900)
Applying pinning: PkgPin(pkg='/^^git-man$/', priority=900)

切换至git用户,安装git

1
2
su git
sudo apt-get install git-core

客户端生产私钥与公钥,并复制追加到Ubuntu服务器

生成公钥和私钥

  1. 在客户端打开git软件,然后输入如下代码,其中Usermail@mail.com 可以修改成任何值;

    当同一台电脑上面有多个ssh时候,需要关注以前是否生成id_rsa 如果有生成那么建议改成用户名 + _id_rsa 格式:User_id_rsa,防止生成ssh时候覆盖了之前的ssh

1
ssh-keygen -t rsa -C 'Usermail@mail.com' -f ~/.ssh/User_id_rsa
  1. 同时还要在~/.ssh 目录下新建一个 config 文件,添加如下内容(其中 Host 和 HostName 填写 git 服务器的域名,IdentityFile 指定私钥的路径)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitee_id_rsa
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa

# 自己服务器(如果没有给服务器设置域名的情况下)
Host 192.168.183.29 ## 这里填写自己服务器IP 例如 服务器IP为: 192.168.183.29
HostName 192.168.183.29 ## 这里填写自己服务器IP 例如 服务器IP为: 192.168.183.29
PreferredAuthentications publickey
IdentityFile ~/.ssh/User_id_rsa ## 这里填写上面生成的密钥

# 自己服务器有域名的情况下
Host server.xxxx.com ## 这里填写自己服务器的域名 例如 服务器域为: server.xxxx.com
HostName server.xxxx.com ## 这里填写自己服务器的域名 例如 服务器域为: server.xxxx.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/User_id_rsa ## 这里填写上面生成的密钥

​ 其实设置域名和没设置域名只是方便记忆的问题,没有多大区别,别人想找你的服务器还是可以直接找到。

  1. 服务器设置域名,我这里是ubuntu为例,找到路径/etc下的hosts文件,在箭头指定地方添加下面,其中IP修改成你服务器IP ,域名设置成你绑定的域名。
1
192.168.183.29 server.xxxx.com

image-20240620154522860

2.公钥放到服务器中

  1. 在第一章节第3小节在ubuntu中创建了一个git用户,接下来进入该目录下面
1
2
3
4
5
6
7
8
## 切换到git账户
su git

## 进入git用户目录
cd /home/git

## 遍历目录
ll
  1. 查看git目录下是否有.ssh文件夹,如果没有就创建该文件夹,如果有就不用创建。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 创建 .ssh 文件夹
mkdir .ssh

## 如果显示无法创建.ssh文件夹,就是用如下命令
sudo mkdir .ssh


## 查看 .ssh文件夹是否归宿于 git 用户
ll

## 如果不属于,请使用下面命令 ,$USER 代表着设置到当前用户管理权限下
sudo chown -R $USER:$USER .ssh
如果不是在git权限下,需要使用如下命令
sudo chown -R git:git .ssh

效果如图所示,我这里不是创建的git用户名,所以与上面不同,但是效果是相同的

image-创建其他用户

  1. 进入.ssh,如果有authorized_keys文件,就不用创建,如果没有就创建authorized_kesys;该文件主要是存放公钥文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 没有 authorized_keys 就执行下面命令,有就不需要使用该命令
touch authorized_keys

## 查看该文件是否属于你创建的用户,
ll

##如果不属于就执行下面命令,属于就忽略该命令,$USER 代表着设置到当前用户管理权限下
sudo chown -R $USER:$USER authorized_keys

如果不是在git权限下,需要使用如下命令
sudo chown -R git:git .ssh

#进入该文件
vim authorized_keys
  1. 然后将 id_rsa.pub 里的内容添加到 authorized_keys 文件中;可以直接复制粘贴,也可以用命令:cat /home/git/id_rsa.pub>>/home/git/.ssh/authorized_kys;多个密钥就挨个儿往下添加,不要覆盖
  2. 如果你像我一样,有多台电脑,那么创建的时候,就需要换名字,不换名字只能用完一个删一个。

3.创建GIT仓库,以及钩子函数

1.创建GIT裸仓库

  1. 我个人习惯性创建仓库在/usr/local/目录下创建仓库。该仓库位置任意放置都可以,只要自己记住,或者根据自己习惯放置,初始化裸库
1
git init --bare pro.git

pro.git是裸仓库文件夹名称,可以自己定义任何仓库名称,后缀带上.git

  1. 修改裸体仓库权限,使用当前命令,是处于git账户下才使用该命令,如果不是请看第3。
1
sudo chown -R $USER:$USER pro.git
  1. 如果不是出于你需要的用户权限下,使用如下命令
1
sudo chown -R git:git pro.git

2.创建GIT仓库,可以看到对应的文件

1
git init pro

创建了一个仓库,叫做pro,该仓库把权限也像上面一样设置到 git权限下

3.配置自己想要的钩子函数

1.自动化部署

  1. 如果我们想看上传到 pro.git文件夹中的项目,那么可以在 pro.git文件夹下找到hooks,加入该文件夹

创建一个post-receive文件;

1
sudo vim post-receive
  1. 文件内容如下,使用该代码,必须在默认分支master 上才能执行否则需要添加其他配置
1
2
3
#!/bin/bash
unset GIT_DIR
git --work-tree=/usr/local/hexoBlog/pro --git-dir=/usr/local/hexoBlog/pro.git checkout -f

其中--work-tree= 后面的目录就是你刚刚 git init初始化的文件夹;

--git-dir=后面就是你git init --bare裸仓库的目录。

  1. 如果不是在默认分支master上,就执行如下代码
1
2
3
需要使用别的办法


  1. 让该文件变为可执行文件
1
chmod +x ./post-receive

克隆仓库到本地,切换到master默认分支

1. 查看分支

1
2
3
4
5
6
7
8
git branch:这是最常用的命令,它会列出本地仓库所有的分支,当前分支会被标记出来。
git branch -r:此命令会列出所有远程分支。
git branch -a:此命令会列出所有的本地分支和远程分支。
git ls-remote --heads <仓库URL>:此命令会列出指定仓库的所有远程分支。需要将<仓库URL>替换为实际的仓库URL。
git show-ref:此命令会显示所有本地分支和它们的对应引用(commit SHA)。
git log --branches:此命令会显示所有分支的提交历史。
git branch --contains <commit>:此命令会列出包含指定提交的所有分支。需要将<commit>替换为实际的提交哈希值。
需要注意的是,在远程分支被删除后,它们可能仍然存在于本地的缓存中,可以使用git remote update origin --prune来清理本地缓存并同步远程分支列表。

2.创建master分支,并切换到master分支

1
git checkout -b master

文章参考:

1.服务器上的 Git - 设置服务器
2.Ubuntu20.4搭建git服务器
3.利用GIT钩子函数实现自动部署或其他操作
4.了解git裸仓库并利用post-receive自动化部署
5.利用GIT钩子函数实现自动部署或其他操作