2019/08/07 自定義git
自定義git顏色
我們已經(jīng)配置了user.name
和user.email
酌壕,實(shí)際上掏愁,Git還有很多可配置項(xiàng)歇由。
比如,讓Git顯示顏色果港,會(huì)讓命令輸出看起來(lái)更醒目:
$ git config --global color.ui true
這樣沦泌,Git會(huì)適當(dāng)?shù)仫@示不同的顏色,比如git status
命令:
文件名就會(huì)標(biāo)上顏色辛掠。
忽略特殊文件
有些時(shí)候谢谦,你必須把某些文件放到Git工作目錄中,但又不能提交它們萝衩,比如保存了數(shù)據(jù)庫(kù)密碼的配置文件啦回挽,等等,每次git status
都會(huì)顯示Untracked files ...
猩谊,有強(qiáng)迫癥的童鞋心里肯定不爽千劈。
好在Git考慮到了大家的感受,這個(gè)問(wèn)題解決起來(lái)也很簡(jiǎn)單牌捷,在Git工作區(qū)的根目錄下創(chuàng)建一個(gè)特殊的.gitignore
文件墙牌,然后把要忽略的文件名填進(jìn)去,Git就會(huì)自動(dòng)忽略這些文件宜鸯。
不需要從頭寫(xiě).gitignore
文件憔古,GitHub已經(jīng)為我們準(zhǔn)備了各種配置文件,只需要組合一下就可以使用了淋袖。所有配置文件可以直接在線瀏覽:https://github.com/github/gitignore
忽略文件的原則是:
- 忽略操作系統(tǒng)自動(dòng)生成的文件鸿市,比如縮略圖等;
- 忽略編譯生成的中間文件即碗、可執(zhí)行文件等焰情,也就是如果一個(gè)文件是通過(guò)另一個(gè)文件自動(dòng)生成的,那自動(dòng)生成的文件就沒(méi)必要放進(jìn)版本庫(kù)剥懒,比如Java編譯產(chǎn)生的.class文件内舟;
- 忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件初橘。
舉個(gè)例子:
假設(shè)你在Windows下進(jìn)行Python開(kāi)發(fā)验游,Windows會(huì)自動(dòng)在有圖片的目錄下生成隱藏的縮略圖文件,如果有自定義目錄保檐,目錄下就會(huì)有Desktop.ini
文件耕蝉,因此你需要忽略Windows自動(dòng)生成的垃圾文件:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
然后,繼續(xù)忽略Python編譯產(chǎn)生的.pyc夜只、.pyo垒在、dist
等文件或目錄:
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
加上你自己定義的文件,最終得到一個(gè)完整的.gitignore
文件扔亥,內(nèi)容如下:
# 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场躯,就完成了谈为!當(dāng)然檢驗(yàn).gitignore
的標(biāo)準(zhǔn)是git status
命令是不是說(shuō)working directory clean。
使用Windows的童鞋注意了踢关,如果你在資源管理器里新建一個(gè)
.gitignore
文件伞鲫,它會(huì)非常弱智地提示你必須輸入文件名,但是在文本編輯器里“保存”或者“另存為”就可以把文件保存為.gitignore
了签舞。
有些時(shí)候榔昔,你想添加一個(gè)文件到Git,但發(fā)現(xiàn)添加不了瘪菌,原因是這個(gè)文件被.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.
如果你確實(shí)想添加該文件,可以用-f
強(qiáng)制添加到Git:
$ git add -f App.class
或者你發(fā)現(xiàn)嘹朗,可能是.gitignore
寫(xiě)得有問(wèn)題师妙,需要找出來(lái)到底哪個(gè)規(guī)則寫(xiě)錯(cuò)了,可以用git check-ignore
命令檢查:
$ git check-ignore -v App.class
.gitignore:3:*.class App.class
Git會(huì)告訴我們屹培,.gitignore
的第3行規(guī)則忽略了該文件默穴,于是我們就可以知道應(yīng)該修訂哪個(gè)規(guī)則。
小結(jié)
忽略某些文件時(shí)褪秀,需要編寫(xiě)
.gitignore
蓄诽;.gitignore
文件本身要放到版本庫(kù)里,并且可以對(duì).gitignore
做版本管理媒吗!
配置別名
有沒(méi)有經(jīng)常敲錯(cuò)命令仑氛?比如git status
?status
這個(gè)單詞真心不好記闸英。
如果敲git st
就表示git status
那就簡(jiǎn)單多了锯岖,當(dāng)然這種偷懶的辦法我們是極力贊成的。
我們只需要敲一行命令甫何,告訴Git出吹,以后st
就表示status
:
$ git config --global alias.st status
好了,現(xiàn)在敲git st
看看效果辙喂。
當(dāng)然還有別的命令可以簡(jiǎn)寫(xiě)捶牢,很多人都用co表示checkout,ci表示commit巍耗,br表示branch
:
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
以后提交就可以簡(jiǎn)寫(xiě)成:
$ git ci -m "bala bala bala..."
--global
參數(shù)是全局參數(shù)秋麸,也就是這些命令在這臺(tái)電腦的所有Git倉(cāng)庫(kù)下都有用。
在撤銷修改一節(jié)中芍锦,我們知道竹勉,命令git reset HEAD file
可以把暫存區(qū)的修改撤銷掉(unstage
),重新放回工作區(qū)娄琉。既然是一個(gè)unstage
操作次乓,就可以配置一個(gè)unstage
別名:
$ git config --global alias.unstage 'reset HEAD'
當(dāng)你敲入命令:
$ git unstage test.py
實(shí)際上Git執(zhí)行的是:
$ git reset HEAD test.py
配置一個(gè)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"
來(lái)看看git lg
的效果:
配置文件
配置Git的時(shí)候票腰,加上--global
是針對(duì)當(dāng)前用戶起作用的城看,如果不加,那只針對(duì)當(dāng)前的倉(cāng)庫(kù)起作用杏慰。
配置文件放哪了测柠?每個(gè)倉(cāng)庫(kù)的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
]后面,要?jiǎng)h除別名缘滥,直接把對(duì)應(yīng)的行刪掉即可轰胁。
而當(dāng)前用戶的Git配置文件放在用戶主目錄下的一個(gè)隱藏文件.gitconfig
中:
$ cat .gitconfig
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = your@email.com
配置別名也可以直接修改這個(gè)文件,如果改錯(cuò)了朝扼,可以刪掉文件重新通過(guò)命令配置。
小結(jié)
給Git配置好別名
擎颖,就可以輸入命令時(shí)偷個(gè)懶榛斯。
搭建Git服務(wù)器
遠(yuǎn)程倉(cāng)庫(kù)實(shí)際上和本地倉(cāng)庫(kù)沒(méi)啥不同,純粹為了7x24小時(shí)開(kāi)機(jī)并交換大家的修改搂捧。
GitHub
就是一個(gè)免費(fèi)托管開(kāi)源代碼的遠(yuǎn)程倉(cāng)庫(kù)驮俗。但是對(duì)于某些視源代碼如生命的商業(yè)公司來(lái)說(shuō),既不想公開(kāi)源代碼允跑,又舍不得給GitHub
交保護(hù)費(fèi)王凑,那就只能自己搭建一臺(tái)Git服務(wù)器作為私有倉(cāng)庫(kù)使用。
搭建Git服務(wù)器需要準(zhǔn)備一臺(tái)運(yùn)行Linux的機(jī)器吮蛹,強(qiáng)烈推薦用Ubuntu或Debian荤崇,這樣,通過(guò)幾條簡(jiǎn)單的apt
命令就可以完成安裝潮针。
假設(shè)你已經(jīng)有sudo
權(quán)限的用戶賬號(hào)术荤,下面,正式開(kāi)始安裝每篷。
第一步瓣戚,安裝git
:
$ sudo apt-get install git
第二步,創(chuàng)建一個(gè)git
用戶焦读,用來(lái)運(yùn)行git
服務(wù):
$ sudo adduser git
第三步子库,創(chuàng)建證書(shū)登錄:
收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub
文件矗晃,把所有公鑰導(dǎo)入到/home/git/.ssh/authorized_keys
文件里仑嗅,一行一個(gè)。
第四步,初始化Git倉(cāng)庫(kù):
先選定一個(gè)目錄作為Git倉(cāng)庫(kù)仓技,假定是/srv/sample.git
鸵贬,在/srv
目錄下輸入命令:
$ sudo git init --bare sample.git
Git就會(huì)創(chuàng)建一個(gè)裸倉(cāng)庫(kù),裸倉(cāng)庫(kù)沒(méi)有工作區(qū)脖捻,因?yàn)榉?wù)器上的Git倉(cāng)庫(kù)純粹是為了共享阔逼,所以不讓用戶直接登錄到服務(wù)器上去改工作區(qū),并且服務(wù)器上的Git倉(cāng)庫(kù)通常都以.git
結(jié)尾地沮。然后嗜浮,把owner改為git:
$ sudo chown -R git:git sample.git
第五步,禁用shell
登錄:
出于安全考慮摩疑,第二步創(chuàng)建的git用戶不允許登錄shell
危融,這可以通過(guò)編輯/etc/passwd
文件完成。找到類似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改為:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣雷袋,git用戶可以正常通過(guò)ssh使用git专挪,但無(wú)法登錄shell,因?yàn)槲覀優(yōu)間it用戶指定的git-shell
每次一登錄就自動(dòng)退出片排。
第六步,克隆遠(yuǎn)程倉(cāng)庫(kù):
現(xiàn)在速侈,可以通過(guò)git clone
命令克隆遠(yuǎn)程倉(cāng)庫(kù)了率寡,在各自的電腦上運(yùn)行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就簡(jiǎn)單了。
管理公鑰
如果團(tuán)隊(duì)很小倚搬,把每個(gè)人的公鑰收集起來(lái)放到服務(wù)器的/home/git/.ssh/authorized_keys
文件里就是可行的冶共。如果團(tuán)隊(duì)有幾百號(hào)人,就沒(méi)法這么玩了每界,這時(shí)捅僵,可以用Gitosis
來(lái)管理公鑰。
這里我們不介紹怎么玩Gitosis
了眨层,幾百號(hào)人的團(tuán)隊(duì)基本都在500強(qiáng)了庙楚,相信找個(gè)高水平的Linux管理員問(wèn)題不大。
管理權(quán)限
有很多不但視源代碼如生命趴樱,而且視員工為竊賊的公司馒闷,會(huì)在版本控制系統(tǒng)里設(shè)置一套完善的權(quán)限控制,每個(gè)人是否有讀寫(xiě)權(quán)限會(huì)精確到每個(gè)分支甚至每個(gè)目錄下叁征。因?yàn)镚it是為Linux
源代碼托管而開(kāi)發(fā)的纳账,所以Git也繼承了開(kāi)源社區(qū)的精神,不支持權(quán)限控制捺疼。不過(guò)疏虫,因?yàn)镚it支持鉤子(hook
),所以,可以在服務(wù)器端編寫(xiě)一系列腳本來(lái)控制提交等操作卧秘,達(dá)到權(quán)限控制的目的呢袱。Gitolite
就是這個(gè)工具。
這里我們也不介紹Gitolite
了斯议,不要把有限的生命浪費(fèi)到權(quán)限斗爭(zhēng)中产捞。
小結(jié)
搭建Git服務(wù)器非常簡(jiǎn)單,通常10分鐘即可完成哼御;
要方便管理公鑰坯临,用
Gitosis
;要像SVN那樣變態(tài)地控制權(quán)限恋昼,用
Gitolite
看靠。