

前言#
定义一个适合自己风格的 Git,我想这应该没人能拒绝吧,再来试试吧。
忽略特殊文件#
有些时候,你必须把某些文件放到 Git 工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦等等。好在 Git 考虑到了大家的感受,这个问题解决起来也很简单,在 Git 工作区的根目录下创建一个特殊的 .gitignore 文件,然后把要忽略的文件名填进去,Git 就会自动忽略这些文件。
很便利的是,我们不需要从头写 .gitignore 文件,GitHub 已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在 gitignore ↗上浏览。
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等。
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如 Java 编译产生的
.class文件。 - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
有些时候,你想添加一个文件到 Git,但发现添加不了,原因是这个文件被 .gitignore 忽略了。此时,如果你确实想添加该文件,可以用 -f 强制添加到 Git。
$ git add -f App.class # git add -f <filename>bash或者你发现,可能是 .gitignore 写得有问题,需要找出来到底哪个规则写错了,可以用 git check-ignore 命令检查。
$ git check-ignore -v App.class
.gitignore:3:*.class App.classbashGit 会告诉我们,.gitignore 的第 3 行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。但有些时候,当我们编写了规则排除了部分文件时,我们发现 .* 这个规则把 .gitignore 也排除了,并且 App.class 需要被添加到版本库,但是被 *.class 规则排除了。虽然可以用 git add -f 强制添加进去,但有强迫症的童鞋还是希望不要破坏 .gitignore 规则,这个时候,可以添加两条例外规则。
# 排除所有.开头的隐藏文件:
.*
# 排除所有.class文件:
*.class
# 不排除.gitignore和App.class:
!.gitignore
!App.classbash把指定文件排除在 .gitignore 规则外的写法就是 !+文件名,所以,只需把例外文件添加进去即可。同样,我们可以通过GitIgnore Online Generator ↗在线生成 .gitignore 文件并直接下载。
最后一个问题,.gitignore文件放哪?答案是放 Git 仓库根目录下,但其实一个 Git 仓库也可以有多个 .gitignore 文件,.gitignore 文件放在哪个目录下,就对哪个目录(包括子目录)起作用。

搭建 Git 服务器#
GitHub 就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给 GitHub 交保护费,那就只能自己搭建一台 Git 服务器作为私有仓库使用。搭建 Git 服务器需要准备一台运行 Linux 的机器,强烈推荐用 Ubuntu 或 Debian,这样,通过几条简单的apt命令就可以完成安装。假设你已经有 sudo 权限的 Linux 用户账号,下面,正式开始安装。
第一步,安装 git:
$ sudo apt install gitbash第二步,创建一个 git 用户,用来运行 git 服务:
$ sudo adduser gitbash第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的 id_rsa.pub 文件,把所有公钥导入到 /home/git/.ssh/authorized_keys 文件里,一行一个。
第四步,初始化 Git 仓库:
先选定一个目录作为 Git 仓库,假定是 /srv/sample.git,在 /srv 目录下输入命令:
$ sudo git init --bare sample.gitbashGit 就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的 Git 仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的 Git 仓库通常都以 .git 结尾。然后,把 owner 改为 git:
$ sudo chown -R git:git sample.gitbash第五步,禁用 shell 登录:
出于安全考虑,第二步创建的 git 用户不允许登录 shell,这可以通过编辑 /etc/passwd 文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bashbash改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shellbash这样,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.bash剩下的推送就简单了。
管理公钥#
如果团队很小,把每个人的公钥收集起来放到服务器的 /home/git/.ssh/authorized_keys 文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用 Gitosis ↗来管理公钥。这里我们不介绍怎么玩 Gitosis 了,因为我也不会,暂时就留在等我可以管理上百人团队时,我再来补课吧。
管理权限#
有很多不但视源代码如生命,而且视员工为窃贼的公司/团队/课题组,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为 Git 是为 Linux 源代码托管而开发的,所以 Git 也继承了开源社区的精神,不支持权限控制。不过,因为 Git 支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite ↗就是这个工具。这里我也不介绍Gitolite了,因为目前我就孤身一个,暂时还用不到。
补充#
在我尝试往自己搭建的 Git 服务器仓库中 push 相关项目程序时,出现了下面一些问题,可以前去了解 ↗和借鉴 ↗。查找了几个大佬的博客回答,现在将相关的解决方法记录在下。整体的一个我理解的逻辑如下。
服务器端存放的叫裸库(bare),你可以认为就是你的仓库的 .git/ 目录下面的那些东西,不包含工作区(working space)。解决办法:需要在 demo.git 里的 hooks 里创建一个 post-receive 指定项目文件目录,和 git 仓库地址。例如:我在 /home/git/ 下面建的裸库 tmp.git,去 tmp.git/hook 里面设置项目文件目录比如设置为 home/git ,然后你再重新 push 文件就可以在服务器 /home/git/ 下面看到你 push 的文件了。