Git原理及远程仓库用户管理

一:什么是git

git一个优秀的分布式管理版本管理工具。

二:git和svn的管理差异

svn属于集中式版本管理控制系统,系统中保存了所有文件的修订版本,而协同工作人员通过连接svn服务器,提取出最新的文件,获取提交更新。

下图就是标准的集中式版本控制工具管理方式:

Git原理及远程仓库用户管理

集中管理方式在一定程度上看到其他开发人员在干什么,而管理员也可以很轻松掌握每个人的开发权限(做过svn服务端管理的人员都知道)。这种用户管理的便利性,git是不具备的。

但是相较于其优点而言,集中式版本控制工具缺点很明显:

  1. 服务器单点故障
  2. 容错性差

SVN和Git在管理变化的文件上有所不同

Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,请看图 1.4。

Git原理及远程仓库用户管理

Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。

为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一连接。Git 的工作方式就像图 1.5 所示。

Git原理及远程仓库用户管理

 

三:git的优势

Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看(因为git具有远程仓库的克隆镜像local reporsitory)。所以任何时候你都可以马上翻阅,无需等待。

如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。

Git也在数据的完整性上做了很大改进,具体的改进这里不做过多阐述。

四:git管理文件的三种状态

对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。

由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的本地数据目录,工作目录以及暂存区域。

Git原理及远程仓库用户管理

  1. 如果是 git 目录中保存着的特定版本文件,就属于已提交状态;
  2. 如果作了修改并已放入暂存区域,就属于已暂存状态;
  3. 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
  4. push将local repository的commit状态的文件提交到远程的仓库中,此时需要linux的用户才能提交

五:管理远程仓库用户

Git不像Svn一样,svn的服务器端是一个服务应用,在使用时必须启动svn服务,并占用指定的服务器端口,如果服务停止,所有客户端的TortoiesSVN客户端程序无法连接。然而git没有服务的概念,其通过克隆远程仓库都本地,当本地文件发生修改时通过ssh将修改上传到对应的远程仓储中,每一个版本git都记录的是仓库的整体,可以简单的这样立即,当本地仓库push一个版本到远程仓库时,Git将版本另存了一份,上一个版本保存不动,并将版本变化的元数据信息记录到git的数据中(真正的管理比这个复杂的多)。

前面我们已经提到,用户在自己的本地电脑中通过git管理文件,有三种状态:已提交(committed),已修改(modified)和已暂存(staged),当文件从staged区commit到local repository需要用户名及用户邮箱信息,用户必须要事先创建好,本地创建用户可以使用git提供的bash命令创建,也可以使用TortoiesGit进行创建,用户分为全局用户和系统用户,

Git原理及远程仓库用户管理

如上创建的是用户本地的用户,git在push代码到远程仓库的时候需要ssh用户名和密码,下面介绍如何管理远程仓储的服务端用户:

1、初始化仓库
   

 mkdir /home/git   # 在自己指定的文件夹下
 git init --bare sample.git 


2、修改权限
   

 chmod -R 777 sample.git


3、创建用户及用户组
  

  useradd gituser1
    passwd gituser1  # 设置密码
    useradd gituser2
    passwd gituser2 # 设置密码

    *************** 可选 ********************
    禁用git用户的shell登录,防止用户通过Git用户登录服务器。编辑/etc/路径下的passwd文件,将文件后边的bash改成git-shell,
    即将
    gituser1:x:1006:1008::/home/gituser1:/bin/bash 
    改成 
    gituser1:x:1006:1008::/home/gituser1:/bin/git-shell
    ***********************************

    groupadd gitgroup #创建git用户组

    #将用户添加到用户组
    usermod -G gitgroup gituser1
    usermod -G gitgroup gituser2

    cat /etc/group # 查看用户组及用户是否成功配置

4、修改git仓库的用户组
   

 chgrp -R gitgroup /home/git/sample.git/
    或
 chown -R git:gitgroup /home/git/sample.git/

更详细的管理,请查阅这篇文章,讲得很好

https://www.jianshu.com/p/a0eb79fa5b8d