• 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 之后可以从页面查看到内容。

  • 相关阅读:
    将绿色版Tomcat服务添加到系统服务并设为开机运行
    简单的递归遍历树
    js浏览器中的alert死浏览器
    Crontab文件的参数【转载】
    修改tomcat项目的图标
    最后两个and半月
    没有信的信乐团,依然让我动情
    The Network Adapter could not establish the connec
    MySql数据库的备份和恢复
    extjs
  • 原文地址:https://www.cnblogs.com/orange2016/p/16640906.html
Copyright © 2020-2023  润新知