git与github——3,标签管理、git自定义、搭建git服务器
一、标签管理
发布一个版本时,我们通常要在版本库上打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。git有commit id 为什么还要tag?因为commit id是一串16进制表示的东西,看不懂!
1,创建标签
git tag v.. 创建标签:
git tag v1.0
打完标签后查看所有标签:
git tag
默认标签是打在最新提交的commit上的,如果要给历史的commit打标签要怎么做?先找到历史提交的commit id 然后打标签:
git log --pretty=oneline --abbrev-commit
然后根据commit id打标签:
git tag v0.5 ac67f0
再用git tag查看一下:
另外,标签不是按时间顺序来的,而是按字符顺序来的。用git show v0.5可以查看标签信息:
也可以创建带有说明的tag
$ git tag -a v0.1 -m "version 0.1 released" ec12b05
git show里就可以看到这段说明了!
2,操作标签
删除标签:
git tag -d v0.5
如果要推送某个标签到远程,使用命令git push origin <tagname>
:
git push origin v1.0
看下github,这样就有v1.0了:
如果我们要删除这个标签,要怎么做?
git push origin :refs/tags/v1.0
接没有这个tag了
如果要推送本地的全部tag:
git push origin --tags
这样就push了全部tag了。
如果要给github上的官方提意见,可以用pull request
使用GitHub时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况!
如果想体验github飞一般的速度,可以用国内的git托管服务——码云!码云的操作方式和github基本一样。
二、git的自定义配置
git有很多自定义配置项,比如
git config --global color.ui true
设置显示颜色,当然我的git bash是默认显示的。
1,忽略特殊文件
每次git status
都会显示Untracked files ...这部分的设置可以在
.gitignore文件中进行设置,然后把要忽略的文件放进去。当然不用全部自己写咯,通过https://github.com/github/gitignore 这个网址的相关文件可以进行设置的。
2,配置别名、文件
比如用st 代替status:
$ git config --global alias.st status
这样就可以把一大堆的参数的命令进行简写。
配置Git的时候,加上--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了,要查看配置文件:
cat .git/config
配置错了别名也可以在这里删除。
三、搭建git服务器
github是个开源的代码托管服务,如果涉及敏感信息,或者不想让别人看到公司项目的代码,就需要建一个私有的git服务啦。
假设你已经有sudo
权限的用户账号,下面,正式开始安装。
第一步,安装git
:
$ sudo apt-get install git
第二步,创建一个git
用户,用来运行git
服务:
$ sudo adduser git
第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub
文件,把所有公钥导入到/home/git/.ssh/authorized_keys
文件里,一行一个。
第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git
,在/srv
目录下输入命令:
$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git
结尾。然后,把owner改为git
:
$ sudo chown -R git:git sample.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd
文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git
用户可以正常通过ssh使用git,但无法登录shell,因为我们为git
用户指定的git-shell
每次一登录就自动退出。
第六步,克隆远程仓库:
现在,可以通过git clone
命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。
管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys
文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。
管理权限
有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。
这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。