在Shell脚本中使用Git

在Shell脚本中使用Git
在Git中,存在两种命令: plumbing 和 porcelain ,前者将Git作为一个文件管理系统,是直接操作文件的底层命令;后者将Git作为一个版本管理系统,是更高级的命令。
我们平时手动操作git时用的大多是面向版本管理的porcelain高级命令,但这些命令的输出都是为了方便人看的,想从中获取诸如当前分支、当前远程分支等等关键信息的话都需要再做匹配,但是随着git版本的更新迭代,这些输出的格式也会有所变化所以根据porcelain高级命令输出内容定制的脚本通用性不好。
而运用plumbing命令是可以直接得到我们想要的关键信息的,因为它们本来就是git内部的底层命令,就是用来处理git内部信息的。顺便提一句,“管道plumbing”在shell中也有,也是不停的处理并将处理的结果作为后面的参数。

一、一些基本知识

对于Unix/Linux,一切皆文件。而Git,定位便是文件管理系统,不过它还要可以追踪文件内容的变更,为了做到这一点git先是规定了4种对象(git object),接着每个对象都通过SHA1算法得到一个唯一的SHA1值作为该对象的对象名(object name)。
我们在本地的git仓库就是相应的.git目录,这个目录下存放了git 所有的模型对象,如下图所示,但不外乎4类对象(以及他们的引用):

我是缩小后并居中的图

图片源于下面参考链接2

  • Tag 对象
    tag 是指某一时刻整个仓库的快照,tag名就指向这一时刻的最后一次提交,也即是该提交SHA1值的别名,也即是git引用,但同时tag也是专门的一类对象,所以tag比较特殊,它既是引用也是对象;
  • Commit 对象
    表示一次提交,commit 类型的Git对象,(它的SHA1值)记录了commit指向的tree对象,以及提交者(author/committer)的信息;
  • Tree 对象
    对应一次提交中的文件所涉及的目录结构,里面主要有:子目录 (tree),当前目录下单个的文件的文件名 (文件名指向了文件内容blob),文件类型以及一些数据文件权限模型等。
  • Blob 对象
    只用于存储单个文件内容,一般都是二进制的数据文件,不包含任何其他文件信息,比如不包含文件名和其他元数据。
    总结一下,tag对象指向特定时刻的最后一次提交,也即指向Commit对象;Commit对象指向了这次提交涉及的目录结构(Tree对象);Tree对象除了指向子目录还指向了当前目录单个文件(Blob 对象),Blob 对象里存储的就是具体某个文件的内容。
    可以看出,在Git中SHA1就是Git对象的指针,用这种文本化的表示方式也符合Unix 一切皆文本的哲学。
    .git目录下还有一些就是git引用(git reference),就是给一些特别的Commit对象的对象名(SHA1值)取一个别名(因为40位hash值不好记忆),比如上面说的tag对象就是某次提交的SHA1值的别名。这些(直接)引用放在refs/下面,共有3类:
  • HEAD引用
    HEAD引用存储在.git/refs/heads目录下,有多少个分支,就有相应的同名HEAD引用对象;而当前处于哪个分支就要看.git/HEAD这个符号引用了,它是整个代码库级别的HEAD引用。也就是.git/HEAD根据当前在哪个分支指向.git/refs/heads目录下相应的分支名,而.git/refs/heads目录下相应的分支名又指向它分支的最后一次提交。
  • 标签引用
    标签引用都存储在.git/refs/tags里面,同上面tag对象,因为tag既是引用又是对象。
  • 远程引用
    .git/refs/heads中存储的本地仓库各分支的最后一次提交,在.git/refs/remotes是用来记录多个远程仓库各分支的最后一次提交。

.git/下如HEAD、FETCH_HEAD、ORIGIN_HEAD以及MERGE_HEAD也是引用,其中HEAD是间接指向Git对象的符号引用(symbiolic reference)或称为symref。
所以现在再来整体看一下.git/下的内容,首先是4种对象,他们以SHA1值的形式存放在objects中;然后是一些引用,一些特殊的直接放在。git/下,其余的3大类都在refs下;然后始索引index,它是一个暂存区,存放add但为commit的内容;logs存放提交日志。

二、一些git命令

这里前面6条就是常用的plumbing命令。
其实主要分析了两类命令,一类是解析git 引用的git show-ref/git symbolic-ref/git for-each-ref,另一类是解析commit等SHA1值的git rev-list/git rev-parse。
其他还有一些零散的常用命令。

1.git cat-file

git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -p | <type> | --textconv | --filters) [--path=<path>] <object>
or: git cat-file (--batch[=<format>] | --batch-check[=<format>]) [--follow-symlinks] [--textconv | --filters]

git cat-file主要用来查询一个git对象的信息。一些用法如:
git cat-file -t 查看每个 SHA-1 (对象)的类型;
git cat-file -p 查看每个对象的内容和简单的数据结构;

2.git show-ref


git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference]
             [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags]
             [--heads] [--] [<pattern>…​]
git show-ref --exclude-existing[=<pattern>]

用于列出当前仓库的refs/下的引用。
不加任何参数是显示所有存在的引用;
加如–head,–tags可只列出相应的引用;
加–verify时需要给它一个确切的路径如refs/heads/master,来验证该路径下是否有引用,有则列出否则报错;
还可加pattern来筛选,如git show-ref master即只列出包含master的引用。

3.git symbolic-ref


git symbolic-ref [-m <reason>] <name> <ref>
git symbolic-ref [-q] 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值