Git 服务部署

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 git@192.168.1.10:/data/git-root/shell.git
#创建一个测试文件
$ touch test.sh
#全局配置
$ git config --global user.name "yu.x"
$ git config --global user.email "yu.x@qq.com"
#提交文件
$ 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
git@192.168.1.10'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
user.email=yu.x@qq.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=git@192.168.1.10:/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 = yu.x@qq.com
	name = yu.x

差异分析工具:在解决合并冲突时使用的工具,比如使用vimdiff

$ git config --global merge.tool vimdiff

Git 使用

Git 常用的是以下 6 个命令:git clonegit pushgit addgit commitgit checkoutgit 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 <yu.x@qq.com>
| | Date:   Thu Jan 27 23:21:58 2022 -0500
| | 
| |     changed
| |   
| * commit 9e574e046239d14783ff446b90ff57395abc1878
| | Author: yu.x <yu.x@qq.com>
| | Date:   Thu Jan 27 23:02:50 2022 -0500
| | 
| |     change newtest.txt
| |   
* | commit c5826bd003dda10062be564edd987926d7efb5bd
|/  Author: yu.x <yu.x@qq.com>
|   Date:   Thu Jan 27 23:10:46 2022 -0500
|   
|       changed
|  
* commit 82f91cee854694ef97e942a4f904b18ae4b8d15a
| Author: yu.x <yu.x@qq.com>
| Date:   Thu Jan 27 22:33:55 2022 -0500
| 
|     remove test.txt, add newtest.txt
|  
* commit 1850696f4a7b22d95707c61eba7fd6c956fa718e
| Author: yu.x <yu.x@qq.com>
| Date:   Thu Jan 27 22:29:48 2022 -0500
| 
|     add text.txt
|  
* commit ab99886596c42734de2be1fee237b71c34df962c
  Author: yu.x <yu.x@qq.com>
  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'] = "zhumeng0215@126.com"  # 自己的邮箱账号
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'] = "zhumeng0215@qq.com"  # 指定发送邮件的邮箱地址
user["git_user_email"] = "1219059271@qq.com"   # 指定接收邮件的邮箱地址

#初始化,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 到本地
$ git@192.168.1.10:test/web01.git
#初始化
$ git config --global user.name "git"
$ git config --global user.email "git@qq.com"
#新建一个文件,然后提交到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 git@192.168.1.10:test/web01.git
   ea9274c..1d3a64c  main -> main

Push 之后可以从页面查看到内容。

posted @ 2022-08-30 21:29  逆流的鱼2016  阅读(363)  评论(0编辑  收藏  举报