首页 > 其他分享 >代码管理系统简介与部署git、gitHub、gitLab

代码管理系统简介与部署git、gitHub、gitLab

时间:2024-09-24 12:18:59浏览次数:3  
标签:Git linuxprobe gitHub gitLab client git 版本 root

        在开发一个项目时,如果只有几十行代码或几百行代码时维护还算简单,但是当代码数量达到一定程度或两三个人共同开发一个项目时,就很容易会出现代码混乱、冲突、排错难等问题。当代码编写完成以后发现整个项目运行不了时,提交的代码也无法确认到责任人,导致维护项目时需要花费数倍的时间。为解决上述问题,版本控制系统应运而生。
        版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。

一、版本控制

1.版本控制概念

        版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。
        具体来说,在每一项开发任务中,都需要首先设定开发基线,确定各个配置项的开发初始版本,在开发过程中,开发人员基于开发基线的版本,开发出所需的目标版本。当发生需求变更时,通过对变更的评估,确定变更的影响范围,对被影响的配置项的版本进行修改,根据变更的性质使配置项的版本树继续延伸或产生新的分支,形成新的目标版本,而对于不受变更影响的配置项则不应发产生变动。同时,应能够将变更所产生的对版本的影响进行记录和跟踪。必要时还可以回退到以前的版本。例如当开发需求或需求变更被取消时,就需要有能力将版本回退到开发基线版本。在曾经出现过的季度升级包拆包和重新组包的过程中,其实就是将部分配置项的版本回退到开发基线,将对应不同需求的不同分支重新组合归并,形成新的升级包版本。
        版本控制是软件配置管理的核心功能。所有置于配置库中的元素都应自动予以版本的标识,并保证版本命名的唯一性。版本在生成过程中,自动依照设定的使用模型自动分支、演进。除了系统自动记录的版本信息以外,为了配合软件开发流程的各个阶段。还需要定义、收集一些元数据来记录版本的辅助信息和规范开发流程,并为今后对软件过程的度量做好准备。当然如果选用的工具支持,这些辅助数据将能直接统计出过程数据,从而方便软件过程改进活动的进行。对于配置库中的各个基线控制项,应该根据其基线的位置和状态来设置相应的访问权限。一般来说,对于基线版本之前的各个版本都应处于被锁定的状态,如需要对它们进行变更,则应按照变更控制的流程来进行操作。
        版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。简单来说就是用于管理多人协同开发项目的技术。
        没有进行版本控制或者版本控制本身就缺乏正确的流程管理,在软件开发过程中将会引入很多问题,如软件代码的一致性、软件内容的冗余、软件过程的事物性、软件开发过程中的并发性、软件源代码的安全性,以及软件的整合等问题。无论是工作还是学习,或者是自己做笔记,都经历过这样一个阶段!我们就迫切需要一个版本控制工具。(多人开发就必须要使用版本控制)

2.版本控制的功能

(1)检入检出控制

        软件开发人员对源文件的修改不能在软件配置管理库中进行,对源文件的修改依赖于基本的文件系统并在各自的工作空间下进行。为了方便软件开发,需要不同的软件开发人员组织各自的工作空间。一般说来,不同的工作空间由不同的目录表示,而对工作空间的访问,由文件系统提供的文件访问权限加以控制。访问控制需要管理各个人员存取或修改一个特定软件配置对象的权限。开发人员能够从库中取出对应项目的配置项进行修改,并检入到软件配置库中,对版本进行“升级”;配置管理人员可以确定多余配置项并删除。
        同步控制的实质是版本的检入检出控制。检入就是把软件配置项从用户的工作环境存入到软件配置库的过程,检出就是把软件配置项从软件配置库中取出的过程。检人是检出的逆过程。同步控制可用来确保由不同的人并发执行的修改不会产生混乱。

(2)分支和合并

        版本分支(以一个已有分支的特定版本为起点,但是独立发展的版本序列)的人工方法就是从主版本一称为主干上拷贝一份,并做上标记。在实行了版本控制后,版本的分支也是一份拷贝,这时的拷贝过程和标记动作由版本控制系统完成。版本合并(来自不同分支的两个版本合并为其中一个分支的新版本)有两种途径,一是将版本A的内容附加到版本B中;另一种是合并版本A和版本B的内容,形成新的版本C。

(3)历史记录

        版本的历史记录有助于对软件配置项进行审核,有助于追踪问题的来源。历史记录包括版本号、版本修改时间、版本修改者、版本修改描述等最基本的内容,还可以有其他一些辅助性内容,比如版本的文件大小和读写属性。

3.版本控制的流程

        版本控制基本流程如下:

(1)创建配置项。

        项目成员依据《配置管理计划》,在配置库中创建属于其任务范围内的配置项。此时配置项的状态为“草稿”,其版本号格式为 8.YZ。

(2)修改状态为“草稿”的配置项目。

        项目成员使用配置管理软件的 Check in/check out 功能,可以自由修改处于“草稿”状态的配置项,版本号格式为 8.YZ。

(3)技术评审或领导审批。

        如果配置项是技术文档,则需要接受技术评审。如果配置项是“计划”这类文件,则需要项目经理(或上级领导)的审批。若配置项通过了技术评审或领导审批,则转向下一步·否则转回上一步。

(4)正式发布。

        配置项通过技术评审或领导审批之后。则配置项的状态从“草稿”变为“正式发布”,版本号格式为X.Y。

(5)变更。

        修改处于“正式发布”状态的配置项,必须按照“变更控制流程”执行。

4.版本控制的优势

  • 实现跨区域多人协同开发
  • 追踪和记载一个或者多个文件的历史记录
  • 组织和保护你的源代码和文档
  • 统计工作量
  • 并行开发、提高开发效率
  • 跟踪记录整个软件的开发过程
  • 减轻开发人员的负担,节省时间,同时降低人为错误

二、版本控制的分类

1.本地版本控制

        许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。
        为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。但是,它的最大的弊端就是无法让位于不同系统上的开发者协同工作。

2.集中化的版本控制

        为了解决不同开发者之间的协同工作,集中化的版本控制系统(centralized Version controlSystems,简称 CVCS)应运而生。这类系统,诸如 CVS、Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。
        这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。 现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
        事分两面,有好有坏。 这么做最显而易见的缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据一包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。 本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。

3.分布式版本控制

        为了避免中央服务器的单点故障,于是分布式版本控制系统(Distributed Version control system,简称 DVCS)面世了。
        在这类系统中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来,包括完整的历史记录。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
        更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。这就是git分布式版本系统的优势。

三、常见的版本控制系统介绍

1.Git

        Git(读音为/gIt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
        Git 的优势就是:每个人都拥有全部的代码,可以避免一些安全隐患。不会因为服务器损坏或者网络问题,造成不能工作的情况。
        所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时 push 到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
        Git 是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件 A,其他人也在电脑上改了文件 A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。Git 可以直接看到更新了哪些代码和文件!

2.GitHub

        GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。GitHub 可以提供给用户空间创建 Git 仓储,保存用户的一些数据文档或者代码等。GitHub 作为开源代码库以及版本控制系统,目前拥有 140 多万开发者用户。随着越来越多的应用程序转移到了云上,GitHub 已经成为了管理软件开发以及发现已有代码的首选方法。GitHub 可以托管各种Git 库,并提供一个 Web 界面,但与其它像 SourceForge 或 Google code 这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。
        GitLab 是一个基于 Git 的项目管理软件,用于仓库管理系统的开源项目。使用 Git 作为代码管理工具,并在此基础上搭建起来 Web 服务。Git、Gitlab、Github 都是基于 Git 的,可以说是 Git 的衍生品。

3.GitLab

        Gitlab 是一款自由和免费的开源软件,因此不需要编写许可证或购买许可证。它允许开发者将源代码托管到自有服务器或者像 Gitlab.com 这样的云端服务器上。这个免费的模式非常适合中小型企业开发者,可以获得许多强大的功能,如代码分枝、分支合并、查看历史变更等
        Gitlab 非常易于使用和管理。它提供了一个友好的 web 界面,可以让开发者在浏览器中完成 Git 的核心操作。它为用户提供了许多简单易用的功能,如 API、集成、安全,以及其他一些其他的托管服务功能。除此之外,Gitlab 管理界面也很直观,可以方便的管理用户权限和代码基础设施的其他方面。

4.其他版本控制系统

        其他开放源码的版本控制工具还有有很多,如 Concurrent Versions system(csV)、Subversion(SVN)、Vesta、Revision Control system(Rcs)、Source code control system(sccs)等。比较常用的两个工具是 CVS 和 SVN。CVS 是 Dick Grune 在 1984年~1985 年基于 RCS 开发的一个客户一服务器架构的版本控制软件,长久以来一直是免费版本控制软件的主要选择。SN 的一个重要开发目标是修正 CVS 中广为人知的缺点,提供一个新的版本控制软件。对于中小规模团队,SVN 是一个比较好的开源版本控制工具,SVN 常用客户端工具为 TortoisesW.

四、Git的工作原理

1.Git 的核心概念

        Git 是一个分布式版本控制系统,它的核心是 Git 对象、Git 树和提交(快照)历史链这三个概念Git 原理的核心可以概括为以下几点:

(1)Git 对象

        Git 中的所有数据都存储在 Git 对象中。每个 Git 对象都由一个 SHA-1 校验和作为唯一的标识符,可以是文件内容、目录结构或者版本历史等。

(2)Git 树

        Git 树是由 Git 对象组成的一个目录结构,保存了文件夹、文件和子树的信息,每个树对象都包含一个或多个子对象的引用。

(3)提交历史链

        每个提交对象都可以有一个或多个父对象,形成一个提交历史链。通过这个提交历史链,Git 可以跟踪每个文件的修改历史,也可以方便地进行版本回滚、分支合并等操作。

(4)Git 分支

        分支是指向 Git 仓库中某一次提交的一个指针,也就是一个指向 Git 提交历史的引用。每个分支都包含了 Git 仓库中的一个提交对象,这个提交对象指向了你项目的一个特定状态。

(5)Git 工作区

        工作区是文件的实际工作目录,是你在电脑上看到的目录。在执行“git add” 命令前,工作区的文件修改和添加不会被 Git 跟踪。

(6)Git 暂存区

        暂存区是一个临时的存储区域,用于存储将要提交的文件和修改。在执行“git add”命令时,修改的文件会被保存到暂存区中。

(7)Git 远程仓库

        远程仓库是指存储在远程服务器上的 Git 仓库,用于多人协作开发、备份和共享代码。Git 支持多种协议,如 HTTPS、SSH 等,可以通过`git remote、命令管理远程仓库。
        Git 的强大之处在于它的分布式特性和提交历史链的设计,使得团队协作和代码管理更加方便和高效。

2.git的存储

        Git 的工作流程可以简单概括为将工作目录(working directory)的修改提交到暂存区(stagingarea),再将暂存区的修改提交到本地仓库(1ocal repository),最后将本地仓库的修改推送到远程仓库(remote repository)
        在 Git 中,对象分为三种类型:blob、tree 和 commit。blob 对象表示文件内容;tree 对象表示文件夹或目录结构;commit 对象表示一个提交或快照,commit 对象包含作者、时间戳、提交信息等版本信息。每一次我们修改文件,Git 都会完整的保存一份这个文件的快照而非记录差异。每次提交到暂存区的时候,都会把需要暂存文件的副本放到仓库里面(为blob对象)并为每个blob对象生成一个sha-1这一堆 blob 对象包括当前暂存的所有修改。
        提交的时候,生成一个快照(一堆暂存的blob 对象和没有变化的对象就形成了当前修改的一个快照,是一个 tree 对象),并生成一个提交对象包含这个快照的指针,并包含一些提交信息。同时还有一个或者多个指针指向当前提交的前一次提交。
        每次提交会生成一个校验和,这个校验和就唯一指定一个提交。所以一次提交就相当于给整个库打了一个不可变的快照。
        git add 添加文件到暂存区,并且创建数据对象添加到 tree 对象中且记录到 git 数据库

        git commit 然后把以上的 tree 对象添加到 commit 对象中记录到 git 数据库中。

3.其他相关概念

(1)Git 的标签(Tag)管理

        Git 支持标签管理,可以给代码库中的某个版本打上标签,方便以后查找和回滚到指定版本。

(2)Git 的远程仓库管理

        Git 可以将本地仓库推送到远程仓库进行备份或共享。常用的远程仓库有 GitHub、GitLab、Bitbucket 等,Git 支持多种协议进行远程仓库之间的数据传输,如 HTTPS、SSH 等。

(3)Git 的钩子(Hook)

        Git 的钩子是一种脚本,可以在 Git 命令执行前或执行后自动触发,用于实现自定义的功能。Git 支持多种钩子,如提交钩子、合并钩子等。

(4)Git 的子模块(submodule)

        Git 的子模块是一种管理外部代码库的方式,可以将外部代码库嵌入到主代码库中,方便管理和维护。

(5)Git的工作流(Workflow)

        Git 文持多种工作流,如集中式工作流、功能分支工作流、Gitflow 工作流等,可以根据项目需求选择不同的工作流进行代码管理和版本控制。

五、部署 Git 服务器

1.系统环境准备

[root@localhost ~]# hostnamectl set-hostname git
[root@localhost ~]# bash
[root@git ~]# systemctl stop firewalld
[root@git ~]# systemctl disable firewalld
[root@git ~]# systemctl stop NetworkManager
[root@git ~]# systemctl disable NetworkManager
[root@git ~]# sed -i'/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config

2.使用YUM安装Git 

[root@git ~]# yum -y install git

 注意:
        无论是代码仓库,还是开发者的计算机,都需要安装。

3.Git 的常用操作

git 有六个常用 命令:

(1)第一次初始化
(2)初始化仓库
(3)加到缓存区
(4)提交至本地仓库
(5)推送本地仓库信息至远程仓库
(6)拉取远程仓库最新文件

4.服务器端基本设置

(1)在服务器端初始化 Git 仓库
[root@git ~]# mkdir /opt/linuxprobe.git
[root@git ~]# cd /opt/linuxprobe.git/
[root@git linuxprobe.git]# git --bare init
初始化空的 Git 版本库于 /opt/linuxprobe.git/

         在本案例中,我们要将该服务器初始化为远程仓库,提供给其他开发人员用来提交项目,在初始化的时候,需要加上--bare 的选项。
备注:
git init:建立一个标准的 git 仓库,它将我们所在的目录转换为一个 Git 本地仓库。建立一个标准的 Git 仓库,这样的仓库初始化后,其项目目录为工作空间,其下的.git 目录是版本控制器。git init 命令执行后会在本地生成一个 .git 的文件夹,用来追踪仓库的所有变更。
git init--bare:它将我们所在的目录指定为远程服务器仓库这样的仓库初始化后,其项目目录下就是标准仓库.git 日录里的内容,没有工作空间。这个仓库只保存git 历史提交的版本信息,而不允许用户在上面进行各种 git 操作(如:push、commit 操作)。但是,你依旧可以使用 git show 命令査看提交内容。

5.客户端基本信息设置

(1)在客户端设置 ssh 密钥对

        有了 ssh 免密环境后,客户端向 git 仓库推送代码时,就不需要输入用户密码。

[root@localhost ~]# hostnamectl set-hostname client
[root@localhost ~]# bash
[root@localhost ~]# yum -y install git
[root@client ~]# ssh-keygen
[root@client ~]# ssh-copy-id 192.168.10.105
 (2)从 Git 服务器中克隆版本仓库到客户端本地
[root@client ~]# git clone [email protected]:/opt/linuxprobe.git
正克隆到 'linuxprobe'...
warning: 您似乎克隆了一个空版本库。

         此时会在当前目录下生成一个名为“1inuxprobe”的空目录,这个步骤的目的是将服务器端的项目(空项目)克降到本地,这样就在本地建立了一个代码库,开发者就可以基于此代码库进行程序开发。之后就可以将代码从本地提交到远程的代码库了。

(3)客户端配置用户信息

        配置用户名称和电子邮件地址。每次 Git 提交时都会引用这两条信息,记录提交了文件的用户,并且会随更新内容一起被永久纳入历史记录。

[root@client ~]# cd linuxprobe/
[root@client linuxprobe]# git config --global user.name "zhang san"
[root@client linuxprobe]# git config --global user.email [email protected]
 (4)设置 vim 为默认的文本编辑器

        设置默认编辑器,当 git 需要输入消息的时候会调用这个编辑器,如果没有设置,将使用系统默认的编辑器。

[root@client linuxprobe]# git config --global core.editor vim
 (5)查看 Git 工作环境信息
[root@client linuxprobe]# git config --list
user.name=zhang san
[email protected]
core.editor=vim
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
[email protected]:/opt/linuxprobe.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

 6.代码提交操作

(1)在客户端编写代码
[root@client linuxprobe]# echo "Hello World" > readme.txt
 (2)将文件添加到暂存区
[root@client linuxprobe]# git add readme.txt

备注:
        “git add .”命令可以将当前目录中的所有文件添加到暂存区 。

(3)将暂存区内容添加到本地仓库中
[root@client linuxprobe]# git commit -m "test01"
[master(根提交) 2baacf9] test01
 1 file changed, 1 insertion(+)
 create mode 100644 readme.txt

 备注:

  • -m:m指的是 message,可以是一些备注信息
  • -a:用于先将所有工作区的变动文件,提交到暂存区,再运行 gitcommit。用了-a参数,就不用执行“git add .”

注意:

  • git commit -m 只是 git add 之后文件放在在暂存区之后的提交,如果暂存区没有 add,是没有效果的。
  • git commit -am 是之前提交过到工作区的日志信息已经存在(git commit -m “日志信息” 文件名)已经执行过,再执行同样的日志信息可以不用 add,一步到位。
(4)为当前版本库设置标签
[root@client linuxprobe]# git tag v1.1 -m "mytest01"
[root@client linuxprobe]# git show v1.1
tag v1.1
Tagger: zhang san <[email protected]>
Date:   Tue Sep 24 09:45:00 2024 +0800

mytest01

commit 2baacf9e60062e64ba588d8eb3b1e7c7a6d829e1
Author: zhang san <[email protected]>
Date:   Tue Sep 24 09:43:43 2024 +0800

    test01

diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..557db03
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1 @@
+Hello World
[root@client linuxprobe]# git show master
commit 2baacf9e60062e64ba588d8eb3b1e7c7a6d829e1
Author: zhang san <[email protected]>
Date:   Tue Sep 24 09:43:43 2024 +0800

    test01

diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..557db03
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1 @@
+Hello World

         master 分支是当前主分支的最新版本,上一步中为代码版本打过标签后没有再提交过新的代码,所以查看到的是相同的内容。

(5)修改文件内容
[root@client linuxprobe]# echo "Hello kgc" > readme.txt
 (6)将新修订的文件添加到暂存区,并添加到本地仓库
[root@client linuxprobe]# git add readme.txt 
[root@client linuxprobe]# git commit -m "text02"
[master e21e750] text02
 1 file changed, 1 insertion(+), 1 deletion(-)
(7)为当前版本库设置标签,并查看新的标签 
[root@client linuxprobe]# git tag v1.2 -m "mytest02"
[root@client linuxprobe]# git show v1.2
tag v1.2
Tagger: zhang san <[email protected]>
Date:   Tue Sep 24 09:48:49 2024 +0800

mytest02

commit e21e750968551e7d320cf8889a6065ee64b9a2af
Author: zhang san <[email protected]>
Date:   Tue Sep 24 09:48:17 2024 +0800

    text02

diff --git a/readme.txt b/readme.txt
index 557db03..8ff9c0f 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1 @@
-Hello World
+Hello kgc
[root@client linuxprobe]# git show master
commit e21e750968551e7d320cf8889a6065ee64b9a2af
Author: zhang san <[email protected]>
Date:   Tue Sep 24 09:48:17 2024 +0800

    text02

diff --git a/readme.txt b/readme.txt
index 557db03..8ff9c0f 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1 @@
-Hello World
+Hello kgc
(8)查看当前工作目录的状态 
[root@client linuxprobe]# git status
# 位于分支 master
无文件要提交,干净的工作区

表示项目已经全部提交,当前没有可提交的项目。

 (9)查看当前文件内容与 Git 版本数据库中的差别
[root@client linuxprobe]# git diff -b v1.1 readme.txt 
diff --git a/readme.txt b/readme.txt
index 557db03..8ff9c0f 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1 @@
-Hello World
+Hello kgc
 (10)添加远程版本库
[root@client linuxprobe]# git remote add gitserver [email protected]:/opt/linuxprobe.git

注意:
在克隆了一个远程仓库到本地的时候,已经在本地自动添加了名称为 origin 的远程仓库,如果想设置其他的仓库名称,可以使用 git remote add 的命令进行添加。

 备注:
如果要删除一个远程仓库,可以使用命令:
git remote remove gitserver

(11)上传代码

#上传主分支当前版本

[root@client linuxprobe]# git push -u gitserver master
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 430 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To [email protected]:/opt/linuxprobe.git
 * [new branch]      master -> master
分支 master 设置为跟踪来自 gitserver 的远程分支 master。

#上传主分支的 v1.1 版本 

[root@client linuxprobe]# git push -u gitserver v1.1
Counting objects: 1, done.
Writing objects: 100% (1/1), 153 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:/opt/linuxprobe.git
 * [new tag]         v1.1 -> v1.1

 #上传主分支的 v1.2 版本

[root@client linuxprobe]# git push -u gitserver v1.2
Counting objects: 1, done.
Writing objects: 100% (1/1), 153 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:/opt/linuxprobe.git
 * [new tag]         v1.2 -> v1.2

 备注:
        -u 参数其实就相当于记录了 push 到远端分支的默认值,这样当下次我们还想要继续 push 的这个远端分支的时候推送命令就可以简写成 git push 即可

(12)克隆代码

为了验证文件是否推送到远程的 Git 服务,可以换个目录(或主机)再次克隆一份版本仓库

[root@client ~]# mkdir test
[root@client ~]# cd test/
[root@client test]# git clone [email protected]:/opt/linuxprobe.git
正克隆到 'linuxprobe'...
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
接收对象中: 100% (8/8), done.
remote: Total 8 (delta 0), reused 0 (delta 0)
[root@client test]# cd linuxprobe/
[root@client linuxprobe]# ls
readme.txt
[root@client linuxprobe]# cat readme.txt 
Hello kgc

 备注:
指定标签下载对应的版本
不指定版本默认下载的最新的版本
git clone -b v1.1 [email protected]:/opt/linuxprobe.git

git clone -b v1.2 [email protected]:/opt/linuxprobe.git

git clone -b master [email protected]:/opt/linuxprobe.git

备注:

  • -b:指定分支名称
  • v1.1是上一个版本,read.txt 中的内容是 aaa
  • v1.2 是当前的最新版本,read.txt 中的内容是 aaa、bbb
  • -b master 的参数可以省去,默认就是克隆 master 分支的当前版本

        至此,我们就完成了一个完整的项目流程,包含远程代码仓库的创建与初始化,并且站在开发者的角度克隆项目、开发代码并提交项目代码。

六、部署GitLab服务器

1.系统环境准备

[root@localhost ~]# hostnamectl set-hostname gitlab
[root@localhost ~]# bash
[root@gitlab ~]# systemctl stop firewalld
[root@gitlab ~]# systemctl disable firewalld
[root@gitlab ~]# systemctl stop NetworkManager
[root@gitlab ~]# systemctl disable NetworkManager
[root@gitlab ~]# sed -i'/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
[root@gitlab ~]# setenforce 0

2. 安装GitLab

将本案例所需的 GitLab 安装包上传到服务器端

[root@gitlab ~]# yum -y install policycoreutils-python
[root@gitlab ~]# rpm -ivh gitlab-ce-15.5.1-ce.0.el7.x86_64.rpm

3.修改配置文件

修改仓库 URL 的显示地址

[root@gitlab ~]# vim /etc/gitlab/gitlab.rb 
external_url 'http://192.168.10.105'

 注意:
        本案例没有修改端口,直接用了 80 端口,注意不要有冲突,
        如果不修改,在克隆项目的时候,给出的仓库链接使用的是 gitlab.example.com,在局域网中使用起来不方便,还要修改成 gitlab 的 ip 地址。修改后就直接是 gitlab 的 ip 地址了。

3.加载配置文件并启动,前提是80 端口没有被占用

[root@gitlab ~]# gitlab-ctl reconfigure
[root@gitlab ~]# yum -y install lsof
[root@gitlab ~]# lsof -i:80
COMMAND  PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   2818       root    7u  IPv4  17957      0t0  TCP *:http (LISTEN)
nginx   2821 gitlab-www    7u  IPv4  17957      0t0  TCP *:http (LISTEN)
nginx   2822 gitlab-www    7u  IPv4  17957      0t0  TCP *:http (LISTEN)

备注:
重启:gitlab-ctl restart
关闭:gitlab-ctl stop 

启动:gitlab-ctl start
状态:gitlab-ctl status
帮助:gitlab-ct1--help

4.在浏览器中输入 http://服务器 IP 地址,访问 GitLab

默认账号:root
默认密码:
在命令行里输入cat /etc/gitlab/initial root password

5.修改 root 登录密码

点击右上角用户头像,在下拉菜单中点 Preferences,在左侧列表中找打 password。本案例中使用的 root密码为 pwd12345,注意密码长度至少8位。

提示:

        在此处做一个快照

6. GitLab 创建空项目

(1)点击“create project”按钮,创建新项目 kgc-demo

(2)填写项目参数,并点击创建按钮

(3)在客户机克隆空项目 
[root@client ~]# git clone http://192.168.10.105/root/kgc.git
正克隆到 'kgc'...
Username for 'http://192.168.10.105': root
Password for 'http://[email protected]': 
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
 (4)为客户端设置 GitLab 为远程仓库
[root@client ~]# cd kgc/
[root@client kgc]# git remote add origin01 http://192.168.10.105/root/kgc.git
(5)客户端创建本地代码 
[root@client kgc]# echo "test web">index.html
[root@client kgc]# git init
重新初始化现存的 Git 版本库于 /root/kgc/.git/

 #提交至暂存区

[root@client kgc]# git add .

 #从暂存区提交到本地仓库

[root@client kgc]# git commit -m "my info"
[main 5254f91] my info
 1 file changed, 1 insertion(+)
 create mode 100644 index.html

#为分支命名为 main 

[root@client kgc]# git branch -M main

#输入账号和密码,将分支版本提交到远程仓库 

[root@client kgc]# git push -u origin01 main
Username for 'http://192.168.10.105': root
Password for 'http://[email protected]': 
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 279 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://192.168.10.105/root/kgc.git
   237578f..5254f91  main -> main
分支 main 设置为跟踪来自 origin01 的远程分支 main。

 注意:
此处需要输入账号密码,是 GitLab 的登录账号密码

备注:

  • -u:相当于记录了 push 到远端分支的默认值,这样当下次我们还想要继续 push 的这个远端分支的时候推送命令就可以简写成 git push 即可
  • -f:强制更新,需要 gitlab 权限允许。

备注:
gitlab 设置权限,允许强制更新
添加用户权限,去掉保护分支,这样能让用户提交强制的操作。项目目录-->左侧栏-->settings-->Repository,右侧目录栏找到 Protected Branches。然后启用“Allowed to force push”。

 7.创建新用户

(1)添加组

点“main menu”-->“Admin’

点“Group”-->“New group”,添加新的项目组,

 (2)填写组信息,并创建组

 (3)添加用户

点“Users" --> "New user",创建新的用户。

(4)设置用户信息并创建

填写如下信息,并点击create user 按钮创建此账户。

 备注:
   access level:用户地访问级别。

  • Regular:普通用户,只能访问属于他自己的组和项目
  • Admin:管理员,可以访问所有的组合项目
(5)设置用户密码

点击“Edit”进入修改密码界面。填写密码并保存,注意密码需要至少8位字符。(此处设置为 pwd12345)

 (6)将用户加入组

 点“main menu”-->“Groups”,进入组界面。

 (7)添加成员

 鼠标放在“Group information”选项,向后选“Members",点“Invite members”添加成员。

 在下图界面填写用户名,并选择一个角色。

 Gitlab 用户在组里面有5 种不同权限:

  • Guest:可以创建 issue、发表评论,不能读写版本库。
  • Reporter:可以克隆代码,不能提交,QA、PM可以赋子这个权限。
  • Developer:可以克隆代码、开发、提交、push,普通开发可以赋予这个权限。
  • Maintainer:可以创建项目、添加 tag、保护分支、添加项目成员、编辑项目,核心开发可以赋予这个权限。
  • Owner:可以设置项目访问权限-Visibility Leve1、删除项目、迁移项目、管理组成员,开发组组长可以赋予这个权限。

8.在用户组中创建项目

(1)用 zhangsan 用户的身份重新登录 GitLab

第一次使用新用户登录,需要重新设置密码,此处还设置为pwd12345

(2)在主面板页面点击“create a project”,添加项目

 (3)导入一个项目

此次我们用导入的方式,导入一个现成的项目。

(4)点击“Repository by URL”按钮添加项目 

(5)添加仓库的 URL

此处,我们选择一个 gitee 上的开源项目 mall,其连接如下:

https://gitee.com/kgc-wjq/league.git

注意:
        此处设置的访问级别为 Private,在客户端进行克隆的时候,就需要输入 zhangsan 的账号密码进行身份认证后才能克隆下来。如果选择Public,在克隆的时候就不需要身份验证了。 

(6)验证导入结果

(7)在客户端克隆 
[root@client ~]# git clone http://192.168.10.105/zhangsan/league.git
正克隆到 'league'...
Username for 'http://192.168.10.105': root
Password for 'http://[email protected]': 
remote: Enumerating objects: 78, done.
remote: Counting objects: 100% (78/78), done.
remote: Compressing objects: 100% (64/64), done.
remote: Total 78 (delta 12), reused 78 (delta 12), pack-reused 0
Unpacking objects: 100% (78/78), done.

标签:Git,linuxprobe,gitHub,gitLab,client,git,版本,root
From: https://blog.csdn.net/henanchenxuyuan/article/details/142477871

相关文章

  • git入门
    文章目录Git是什么?Git的相关理论基础日常开发中,Git的基本常用命令Git进阶之分支处理Git进阶之处理冲突Git进阶之撤销与回退Git进阶之标签tagGit其他一些经典命令Git是什么在回忆Git是什么的话,我们先来复习这几个概念哈~什么是版本控制?百度百科定义是酱紫......
  • nodejs child_process 操作git 提交记录 提取git commit信息
    /***记录发布时的commit信息,用于区分内网版本包之间的差异*/importpathfrom'path';import{writeFileSync}from'fs';import{execSync}from'child_process';letoutputFileName=process.argv[2];if(!outputFileName){outputFileNam......
  • 让人眼前一亮的开源项目「GitHub 热点速览」
    时隔两周,我又带着让人眼前一亮的开源项目回来了!告别数据线、蓝牙、WiFi和网络,只需用手机的摄像头扫描一张动图条形码(需安装应用),就能在设备间传输文件的libcimbar,一款无需联网和蓝牙的文件传输工具,仅用摄像头传输数据。用Rust编写的PostgreSQL数据库命令行管理工具rainfro......
  • Hexo-GitHub部署魔改第一步-config
    Hexo-GitHub部署魔改第一步_config.yml1.config.yml#HexoConfiguration##Docs:https://hexo.io/docs/configuration.html##Source:https://github.com/hexojs/hexo/#Site#设置博客的标题title:YourBlogTitle#子标题,可选subtitle:'xxxxx'#博客的描述,可选......
  • Chirpy+Github
    相关网址Chirpy示例:网页上有官方教程,我写的肯定不全Chirpy示例仓库:这个就是包含官方教程的那个示例的仓库Chirpy模板仓库:直接fork这个仓库,快速搭建,没有多余的东西RealFaviconGenerator:生成图片替换原来的蚂蚁图片fontawesome:扩展侧边栏时,图标可以从这里找......
  • 震撼!AI实时生成游戏,每秒20帧,谷歌扩散模型最新突破一夜爆火,附论文介绍和GitHub代码
    震撼!AI实时生成游戏,每秒20帧,谷歌扩散模型最新突破一夜爆火,附论文介绍和GitHub代码。“比Sora还震撼”,AI可以实时生成游戏了!谷歌DeepMind打造出了首个完全AI驱动的实时游戏引擎——GameNGen。在单个谷歌TPU上,它以每秒20帧模拟起了经典射击类游戏DOOM(毁灭战士)。所有游戏画面都是根据......
  • Git安装使用教程,详细到哭
    我们先来理解下Git工作区、暂存区和版本库概念:工作区:就是你在电脑里能看到的目录。暂存区:英文叫stage或index。一般存放在.git目录下的inde一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎徽关注公zhong号:编程进阶路......
  • Git 工作区、暂存区和版本库
    基本概念我们先来理解下Git工作区、暂存区和版本库概念:工作区:就是你在电脑里能看到的目录。暂存区:英文叫stage或index。一般存放在 .git 目录下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是......
  • Git回退远程的代码
    Git撤销pull命令1、运行gitreflog命令查看你的历史变更记录2.然后用gitreset--hardHEAD@{n},(n是你要回退到的引用位置)回退。比如上图可运行gitreset--hard40a9a83Git回退远程的代码先将本地的代码回退到你需要回退的位置(IDEA界面上操作就可以了)执行gitpush-f......
  • 从零开始一个git操作实例,图文并茂
    徒弟不懂git怎么用,于是写了篇文章,把本地git操作从头写了一遍,自己去看吧!0、基本概念•Git是一个免费、开源的、分布式版本控制系统•它使用一个特殊的叫做仓库的数据库来记录文件的变化•仓库中的每个文件都有一个完整的版本历史记录1)安装sudoapt-updatesudoapt-geti......