有些时候,你必须把某些文件放到Git工做目录中,但又不能提交它们,好比保存了数据库密码的配置文件啦,等等,每次git status
都会显示Untracked files ...
,有强迫症的童鞋内心确定不爽。html
好在Git考虑到了你们的感觉,这个问题解决起来也很简单,在Git工做区的根目录下建立一个特殊的.gitignore
文件,而后把要忽略的文件名填进去,Git就会自动忽略这些文件。git
不须要从头写.gitignore
文件,GitHub已经为咱们准备了各类配置文件,只须要组合一下就可使用了。全部配置文件能够直接在线浏览:https://github.com/github/gitignoregithub
忽略文件的原则是:shell
.class
文件;举个例子:数据库
假设你在Windows下进行Python开发,Windows会自动在有图片的目录下生成隐藏的缩略图文件,若是有自定义目录,目录下就会有Desktop.ini
文件,所以你须要忽略Windows自动生成的垃圾文件:安全
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
而后,继续忽略Python编译产生的.pyc
、.pyo
、dist
等文件或目录:ruby
# Python: *.py[cod] *.so *.egg *.egg-info dist build
加上你本身定义的文件,最终获得一个完整的.gitignore
文件,内容以下:bash
# Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa
最后一步就是把.gitignore
也提交到Git,就完成了!固然检验.gitignore
的标准是git status
命令是否是说working directory clean
。服务器
使用Windows的童鞋注意了,若是你在资源管理器里新建一个.gitignore
文件,它会很是弱智地提示你必须输入文件名,可是在文本编辑器里“保存”或者“另存为”就能够把文件保存为.gitignore
了。app
有些时候,你想添加一个文件到Git,但发现添加不了,缘由是这个文件被.gitignore
忽略了:
$ git add App.class The following paths are ignored by one of your .gitignore files: App.class Use -f if you really want to add them.
若是你确实想添加该文件,能够用-f
强制添加到Git:
$ git add -f App.class
或者你发现,多是.gitignore
写得有问题,须要找出来到底哪一个规则写错了,能够用git check-ignore
命令检查:
$ git check-ignore -v App.class .gitignore:3:*.class App.class
Git会告诉咱们,.gitignore
的第3行规则忽略了该文件,因而咱们就能够知道应该修订哪一个规则。
忽略某些文件时,须要编写.gitignore
;
.gitignore
文件自己要放到版本库里,而且能够对.gitignore
作版本管理!
有没有常常敲错命令?好比git status
?status
这个单词真心很差记。
若是敲git st
就表示git status
那就简单多了,固然这种偷懒的办法咱们是极力同意的。
咱们只须要敲一行命令,告诉Git,之后st
就表示status
:
$ git config --global alias.st status
好了,如今敲git st
看看效果。
固然还有别的命令能够简写,不少人都用co
表示checkout
,ci
表示commit
,br
表示branch
:
$ git config --global alias.co checkout $ git config --global alias.ci commit $ git config --global alias.br branch
之后提交就能够简写成:
$ git ci -m "bala bala bala..."
--global
参数是全局参数,也就是这些命令在这台电脑的全部Git仓库下都有用。
在撤销修改一节中,咱们知道,命令git reset HEAD file
能够把暂存区的修改撤销掉(unstage),从新放回工做区。既然是一个unstage操做,就能够配置一个unstage
别名:
$ git config --global alias.unstage 'reset HEAD'
当你敲入命令:
$ git unstage test.py
实际上Git执行的是:
$ git reset HEAD test.py
配置一个git last
,让其显示最后一次提交信息:
$ git config --global alias.last 'log -1'
这样,用git last
就能显示最近一次的提交:
$ git last commit adca45d317e6d8a4b23f9811c3d7b7f0f180bfe2 Merge: bd6ae48 291bea8 Author: Michael Liao <askxuefeng@gmail.com> Date: Thu Aug 22 22:49:22 2013 +0800 merge & fix hello.py
甚至还有人丧心病狂地把lg
配置成了:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
来看看git lg
的效果:
为何不早点告诉我?别激动,咱不是为了多记几个英文单词嘛!
配置Git的时候,加上--global
是针对当前用户起做用的,若是不加,那只针对当前的仓库起做用。
配置文件放哪了?每一个仓库的Git配置文件都放在.git/config
文件中:
$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true [remote "origin"] url = git@github.com:michaelliao/learngit.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [alias] last = log -1
别名就在[alias]
后面,要删除别名,直接把对应的行删掉便可。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig
中:
配置别名也能够直接修改这个文
$ cat .gitconfig [alias] co = checkout ci = commit br = branch st = status [user] name = Your Name email = your@email.com
件,若是改错了,能够删掉文件从新经过命令配置。
给Git配置好别名,就能够输入命令时偷个懒。咱们鼓励偷懒。
在远程仓库一节中,咱们讲了远程仓库实际上和本地仓库没啥不一样,纯粹为了7x24小时开机并交换你们的修改。
GitHub就是一个免费托管开源代码的远程仓库。可是对于某些视源代码如生命的商业公司来讲,既不想公开源代码,又舍不得给GitHub交保护费,那就只能本身搭建一台Git服务器做为私有仓库使用。
搭建Git服务器须要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,经过几条简单的apt
命令就能够完成安装。
假设你已经有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了,不要把有限的生命浪费到权限斗争中。