Git 服务部署
一、Git,Github,Gitlab的区别
Git 是一个快速、可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问。
GitHub 是在线的机遇git的代码托管服务,有免费和收费版,都可以创建公开的代码仓库,但只有付费版可以创建私有代码仓库
Gitlab 解决了GitHub的问题,可以创建私有仓库
二、Git 与SVN 的区别
Git是分布式的,而SVN 不是,这是最核心的区别。SVN 有客户端和服务端。
Git 按元数据方式存储,而SVN 按文件存储
Git 分支和SVN 分支不同,分支在SVN 中就是版本库中的另一个目录
Git没有全局版本号,而SVN 有,这是目前为止,跟SVN 相比,Git缺少的最大一个特征
Git的内容完整性优于SVN。Git的内容存储使用SHA-1 hash算法,这能确保代码内容的完整性,遇到磁盘故障或网络问题时降低对版本库的破坏。
三、Git 服务部署
下载git 安装包 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.34.1.tar.gz
#解决安装依赖包 git 服务端ip 192.168.1.10
$ yum -y install zlib-devel perl-ExtUtils-MakeMaker asciidoc xmlto openssl-devel
$ yum -y install curl-devel expat-devel gettext-devel gcc-c++
#直接通过网页下载,然后使用ftp上传到linux服务器
$ cd /usr/src
#解压git 包并进入目录
$ tar -xf git-2.34.1.tar.gz
$ cd git-2.34.1
#编译并制定安装路劲
$ ./configure --prefix=/usr/local/git
$ make && make install
#配置全局路劲
$ export PATH="/usr/local/git/bin:$PATH"
$ source /etc/profile
#查看git版本
$ git --version
$ git version 2.34.1
#添加git 用户,密码123456
$ useradd git
$ passwd git
#在/data 目录下初始化创建git 仓库
$ cd /data
$ mkdir git-root
$ cd git-root/
$ git init --bare shell.git #得到shell.git目录
#修改目录权限
$ chown -R git:git shell.git
使用--bare选项时,不在生成.git目录,而是生成.git目录下的版本历史记录文件,这些版本历史记录文件也不再存在.git目录,而是直接存放在版本库的根目录下
用git init 初始化版本库,适用于客户端,用户也可以在该目录下执行所有的git操作,但别的用户将更新push上来时容易出现冲突
用git init --bare方法创建一个所谓的裸仓库,适用于服务端,这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作。如果硬要操作,只会得到提示“This operation must be run in a work tree”, 这就是最好吧原创仓库初始化为bare仓库的原因。
#client 端的操作,同样需要安装git软件
$ git clone [email protected]:/data/git-root/shell.git
#创建一个测试文件
$ touch test.sh
#全局配置
$ git config --global user.name "yu.x"
$ git config --global user.email "[email protected]"
#提交文件
$ git commit -m "first commit"
[master (root-commit) e054601] first commit
1 file changed, 4 insertions(+)
create mode 100644 test.sh
#测试验证
$ git push origin master
[email protected]'s password:
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 232 bytes | 232.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To 192.168.1.10:/data/git-root/shell.git
* [new branch] master -> master
四、Git 工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
五、基本概念
我们先来理解下 Git 工作区、暂存区和版本库概念:
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
- 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。
- 图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
- 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
- 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
- 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
- 当执行 git rm --cached
命令时,会直接从暂存区删除文件,工作区则不做出改变。 - 当执行 git checkout . 或者 git checkout --
命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。 - 当执行 git checkout HEAD . 或者 git checkout HEAD
命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
Git配置
Git提供了一个叫git config 的工具,专门用来配置或读取相应的环境变量。
#显示当前的 git 配置信息
$ git config --list
[email protected]
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
[email protected]:/data/git-root/shell.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
# 针对当前仓库
$ git config -e
# 针对系统上所有仓库
$ git config -e --global
#查看信息,客户端家目录下.gitconfig 文件
$ cat .gitconfig
[user]
email = [email protected]
name = yu.x
差异分析工具:在解决合并冲突时使用的工具,比如使用vimdiff
$ git config --global merge.tool vimdiff
Git 使用
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull
说明:
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
创建仓库命令
git init |
初始化仓库 |
---|---|
git clone |
拷贝一份远程仓库,也就是下载一个项目。 |
提交与修改
Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。
git add . |
添加文件到暂存区 |
---|---|
git status |
查看仓库当前的状态,显示有变更的文件。 |
git diff |
比较文件的不同,即暂存区和工作区的差异。 |
git commit |
提交暂存区到本地仓库。 |
git reset |
回退版本。 |
git rm |
删除工作区文件。 |
git mv |
移动或重命名工作区文件。 |
提交日志
git log |
查看历史提交记录 |
---|---|
git blame <file> |
以列表形式查看指定文件的历史修改记录 |
远程操作
git remote |
远程仓库操作 |
---|---|
git fetch |
从远程获取代码库 |
git pull |
下载远程代码并合并 |
git push |
上传远程代码并合并 |
分支管理
#创建分支
$ git checkout -b dev
#查看分支
$ git branch
* dev
master
#切换分支
$ git checkout master
#合并分支, 将dev 合并到master分支
$ git merge dev
#删除分支
$ git branch -d dev
$ git branch
* master
合并冲突
#只有master一个分支,分支下有文件newtest.txt
$ git branch
* master
$ ls
newtest.txt
$ cat newtest.txt
second test
#创建新的分支
$ git checkout -b chang-site
Switched to a new branch 'chang-site'
#修改测试文件
$ vi newtest.txt
$ echo "third test" >> newtest.txt
$ cat newtest.txt
second test
third test
#提交文件
$ git commit -am "change newtest.txt"
[chang-site 9e574e0] change newtest.txt
1 file changed, 1 insertion(+)
#切换到master 分支,并修改readme.sh 文件
$ git checkout master
Switched to branch 'master'
$ ls
newtest.txt
#主分支上的文件是旧文件
$ cat newtest.txt
second test
#再次修改主分支上的newtest.txt
$ vi newtest.txt
second test
3th test
#查看文件差异
$ git diff
diff --git a/newtest.txt b/newtest.txt
index 7b45980..cc1acde 100644
--- a/newtest.txt
+++ b/newtest.txt
@@ -1 +1,2 @@
second test
+3th test
#主分支提交修改的内容
$ git commit -am "changed"
[master c5826bd] changed
1 file changed, 1 insertion(+)
#现在这些改变已经记录到我的 "master" 分支了。接下来我们将 "change_site" 分支合并过来
$ git merge chang-site
Auto-merging newtest.txt
CONFLICT (content): Merge conflict in newtest.txt
Automatic merge failed; fix conflicts and then commit the result.
#这里可以看到文件有冲突,打开文件可以看到冲突的内容
$ cat newtest.txt
second test
<<<<<<< HEAD
3th test
=======
third test
>>>>>>> chang-site
# 使用 git status 也可看到冲突
$ git status
# On branch master
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
#
# both modified: newtest.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
#手动修改不同的内容,改为一致的
$ vi newtest.txt
second test
<<<<<<< HEAD
3th test
=======
3th test
>>>>>>> chang-site
#再次提交,可以成功
$ git commit -am "changed"
[master 9908b21] changed
查看提交历史
#查看历史提交记
$ git log
#查看历史提交记录简洁版,加 --oneline
$ git log --oneline
9908b21 changed
c5826bd changed
9e574e0 change newtest.txt
82f91ce remove test.txt, add newtest.txt
1850696 add text.txt
ab99886 first
#查看历史中什么时候出现了分支、合并,加 --graph
$ git log --graph
* commit 9908b21b014b4aa6cb60fc307a324d61e27f5e80
|\ Merge: c5826bd 9e574e0
| | Author: yu.x <[email protected]>
| | Date: Thu Jan 27 23:21:58 2022 -0500
| |
| | changed
| |
| * commit 9e574e046239d14783ff446b90ff57395abc1878
| | Author: yu.x <[email protected]>
| | Date: Thu Jan 27 23:02:50 2022 -0500
| |
| | change newtest.txt
| |
* | commit c5826bd003dda10062be564edd987926d7efb5bd
|/ Author: yu.x <[email protected]>
| Date: Thu Jan 27 23:10:46 2022 -0500
|
| changed
|
* commit 82f91cee854694ef97e942a4f904b18ae4b8d15a
| Author: yu.x <[email protected]>
| Date: Thu Jan 27 22:33:55 2022 -0500
|
| remove test.txt, add newtest.txt
|
* commit 1850696f4a7b22d95707c61eba7fd6c956fa718e
| Author: yu.x <[email protected]>
| Date: Thu Jan 27 22:29:48 2022 -0500
|
| add text.txt
|
* commit ab99886596c42734de2be1fee237b71c34df962c
Author: yu.x <[email protected]>
Date: Thu Jan 27 22:26:10 2022 -0500
first
#逆向显示所有日志 --reverse
$ git log --reverse --oneline
ab99886 first
1850696 add text.txt
82f91ce remove test.txt, add newtest.txt
9e574e0 change newtest.txt
c5826bd changed
9908b21 changed
#指定用户的提交日志可以使用命令
$ git log --author=yu.x --oneline
9908b21 changed
c5826bd changed
9e574e0 change newtest.txt
82f91ce remove test.txt, add newtest.txt
1850696 add text.txt
ab99886 first
#查看指定文件的修改记录
$ git blame newtest.txt
82f91cee (yu.x 2022-01-27 22:33:55 -0500 1) second test
9908b21b (yu.x 2022-01-27 23:21:58 -0500 2) <<<<<<< HEAD
c5826bd0 (yu.x 2022-01-27 23:10:46 -0500 3) 3th test
9908b21b (yu.x 2022-01-27 23:21:58 -0500 4) =======
9908b21b (yu.x 2022-01-27 23:21:58 -0500 5) 3th test
9908b21b (yu.x 2022-01-27 23:21:58 -0500 6) >>>>>>> chang-site
六、Gitlab远程仓库
#关闭防火墙和selinux
#安装依赖包
$ yum install -y curl policycoreutils-python openssh-server
$ systemctl enable sshd
$ systemctl start sshd
# 安装Postfix,用来发送通知邮件
$ yum install postfix
$ systemctl enable postfix
$ systemctl start postfix
#添加官方源
$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh |sudo bash
#安装gitlab,大小近1G,需要花点时间下载
$ yum -y install gitlab-ce
.......
Thank you for installing GitLab!
GitLab was unable to detect a valid hostname for your instance.
Please configure a URL for your GitLab instance by setting `external_url`
configuration in /etc/gitlab/gitlab.rb file.
Then, you can start your GitLab instance by running the following command:
sudo gitlab-ctl reconfigure
For a comprehensive list of configuration options please see the Omnibus GitLab readme
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md
Help us improve the installation experience, let us know how we did with a 1 minute survey:
https://gitlab.fra1.qualtrics.com/jfe/form/SV_6kVqZANThUQ1bZb?installation=omnibus&release=14-7
验证中 : gitlab-ce-14.7.0-ce.0.el7.x86_64 1/1
已安装:
gitlab-ce.x86_64 0:14.7.0-ce.0.el7
完毕!
#修改配置文件
$ vi /etc/gitlab/gitlab.rb
external_url 'http://192.168.1.10'
# 配置邮件服务
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "[email protected]" # 自己的邮箱账号
gitlab_rails['smtp_password'] = "xxx" # 开通smtp时返回的授权码
gitlab_rails['smtp_domain'] = "126.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['gitlab_email_from'] = "[email protected]" # 指定发送邮件的邮箱地址
user["git_user_email"] = "[email protected]" # 指定接收邮件的邮箱地址
#初始化,reload 配置文件,这过程得花费几分钟
$ gitlab-ctl reconfigure
#查看80端口占用情况
$ lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 28678 root 7u IPv4 235652 0t0 TCP *:http (LISTEN)
nginx 28679 gitlab-www 7u IPv4 235652 0t0 TCP *:http (LISTEN)
Gitlab常用命令
gitlab-ctl start # 启动所有 gitlab 组件
gitlab-ctl stop # 停止所有 gitlab 组件
gitlab-ctl restart # 重启所有 gitlab 组件
gitlab-ctl status # 查看服务状态
gitlab-ctl reconfigure # 启动服务
gitlab-ctl show-config # 验证配置文件
gitlab-ctl tail # 查看日志
gitlab-rake gitlab:check SANITIZE=true --trace # 检查gitlab
vim /etc/gitlab/gitlab.rb # 修改默认的配置文件
修改Gitlab 的root 密码
#进入console
$ cd /opt/gitlab/bin
$ gitlab-rails console
--------------------------------------------------------------------------------
Ruby: ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux]
GitLab: 14.7.0 (abbf44bd6cf) FOSS
GitLab Shell: 13.22.2
PostgreSQL: 12.7
--------------------------------------------------------------------------------
Loading production environment (Rails 6.1.4.4)
irb(main):001:0>
irb(main):002:0> u=User.find(1)
=> #<User id:1 @root>
irb(main):003:0> u.password='cheng2016'
=> "cheng2016"
irb(main):004:0> u.save!
=> true
irb(main):005:0> exit
Gitlab 使用
创建group
Menu --> Groups --> New group --> Create group
创建users
Menu --> admin--> users --> Create group
将user添加到group中
groups --> Test --> Add user to this group
创建project 并配置ssh key
Projects --> Create blank project
进入虚拟机,将项目clone 到本地
#将项目clone 到本地
$ [email protected]:test/web01.git
#初始化
$ git config --global user.name "git"
$ git config --global user.email "[email protected]"
#新建一个文件,然后提交到gitlab仓库
$ vi test.sh
This is a test tile, first version.
$ git add test.sh
$ git commit -m "first version"
[main 1d3a64c] first version
1 file changed, 1 insertion(+)
create mode 100644 test.sh
$ git push origin main
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 298 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:test/web01.git
ea9274c..1d3a64c main -> main
Push 之后可以从页面查看到内容。