天天看點

Git 學習筆記:自定義Git(完)前言目錄自定義Git忽略特殊檔案配置别名期末總結

前言

在補習python的時候主要參考的是廖雪峰的教程Python教程,在學習完後準備完成期末作業時,遇到了一個技術難題,需要初步掌握git,是以開始了git的學習。

本教程參考廖雪峰的Git教程

Git簡介可以參看:Git簡介

Git學習筆記:版本復原 Git:版本復原

Git學習筆記:修改Git學習筆記:修改

Git學習筆記: 遠端倉庫Git學習筆記:遠端倉庫

Git學習筆記:分支管理1 Git學習筆記:分支管理1

Git學習筆記:分支管理2Git學習筆記:分支管理2

Git學習筆記:分支管理3Git學習筆記:分支管理3

Git學習筆記:标簽管理以及GItHubGit學習筆記:标簽管理以及GIthub

目錄

  • 前言
  • 目錄
  • 自定義Git
  • 忽略特殊檔案
    • 小結
  • 配置别名
    • 配置檔案
    • 管理公鑰
    • 管理權限
    • 小結
  • 期末總結

自定義Git

在安裝Git一節中,我們已經配置了user.name和user.email,實際上,Git還有很多可配置項。

比如,讓Git顯示顔色,會讓指令輸出看起來更醒目:

這樣,Git會适當地顯示不同的顔色,比如git status指令:

Git 學習筆記:自定義Git(完)前言目錄自定義Git忽略特殊檔案配置别名期末總結

檔案名就會标上顔色。

我們在後面還會介紹如何更好地配置Git,以便讓你的工作更高效。

忽略特殊檔案

有些時候,你必須把某些檔案放到Git工作目錄中,但又不能送出它們,比如儲存了資料庫密碼的配置檔案啦,等等,每次git status都會顯示Untracked files …,有強迫症的童鞋心裡肯定不爽。

好在Git考慮到了大家的感受,這個問題解決起來也很簡單,在Git工作區的根目錄下建立一個特殊的.gitignore檔案,然後把要忽略的檔案名填進去,Git就會自動忽略這些檔案。

不需要從頭寫.gitignore檔案,GitHub已經為我們準備了各種配置檔案,隻需要組合一下就可以使用了。所有配置檔案可以直接線上浏覽:https://github.com/github/gitignore

忽略檔案的原則是:

1.忽略作業系統自動生成的檔案,比如縮略圖等;

2.忽略編譯生成的中間檔案、可執行檔案等,也就是如果一個檔案是通過另一個檔案自動生成的,那自動生成的檔案就沒必要放進版本庫,比如Java編譯産生的.class檔案;

3.忽略你自己的帶有敏感資訊的配置檔案,比如存放密碼的配置檔案。

舉個例子:

假設你在Windows下進行Python開發,Windows會自動在有圖檔的目錄下生成隐藏的縮略圖檔案,如果有自定義目錄,目錄下就會有Desktop.ini檔案,是以你需要忽略Windows自動生成的垃圾檔案:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
           

然後,繼續忽略Python編譯産生的.pyc、.pyo、dist等檔案或目錄:

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
           

加上你自己定義的檔案,最終得到一個完整的.gitignore檔案,内容如下:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My ```
igurations:
db.ini
deploy_key_rsa
           

最後一步就是把.gitignore也送出到Git,就完成了!當然檢驗.gitignore的标準是git status指令是不是說working directory clean。

使用Windows的童鞋注意了,如果你在資料總管裡建立一個.gitignore檔案,它會非常弱智地提示你必須輸入檔案名,但是在文本編輯器裡“儲存”或者“另存為”就可以把檔案儲存為.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;

•. 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
           

以後送出就可以簡寫成:

–global參數是全局參數,也就是這些指令在這台電腦的所有Git倉庫下都有用。

在撤銷修改一節中,我們知道,指令git reset HEAD file可以把暫存區的修改撤銷掉(unstage),重新放回工作區。既然是一個unstage操作,就可以配置一個unstage别名:

當你敲入指令:

$ git unstage test.py
           

實際上Git執行的是:

$ git reset HEAD test.py
           

配置一個git last,讓其顯示最後一次送出資訊:

這樣,用git last就能顯示最近一次的送出:

$ git last
commit adca45d317e6d8a4b23f9811c3d7b7f0f180bfe2
Merge: bd6ae48 bea8
Author: Michael Liao <[email protected].com>
Date:   Thu Aug  ::  +

    merge & fix hello.py
           

甚至還有人喪心病狂地把lg配置成了:

來看看git lg的效果:

Git 學習筆記:自定義Git(完)前言目錄自定義Git忽略特殊檔案配置别名期末總結

為什麼不早點告訴我?别激動,咱不是為了多記幾個英文單詞嘛!

配置檔案

配置Git的時候,加上–global是針對目前使用者起作用的,如果不加,那隻針對目前的倉庫起作用。

配置檔案放哪了?每個倉庫的Git配置檔案都放在.git/config檔案中:

$ cat .git/config 
[core]
    repositoryformatversion = 
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
[remote "origin"]
    url = https://github.com/challengef/awesome-python3-webapp2.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
     last = log -
           

别名就在[alias]後面,要删除别名,直接把對應的行删掉即可。

而目前使用者的Git配置檔案放在使用者主目錄下的一個隐藏檔案.gitconfig中:

$ cat .gitconfig
[alias]
    co = checkout
    ci = commit
    br = branch
    st = status
[user]
    name = Your Name
    email 個檔案,如果改錯了,可以删掉檔案重新通過指令配置。


##小結
給Git配置好别名,就可以輸入指令時偷個懶。我們鼓勵偷懶。

#搭建Git伺服器
在遠端倉庫一節中,我們講了遠端倉庫實際上和本地倉庫沒啥不同,純粹為了x24小時開機并交換大家的修改。

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 [email protected]:/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了,不要把有限的生命浪費到權限鬥争中。

小結

•搭建Git伺服器非常簡單,通常10分鐘即可完成;

•要友善管理公鑰,用Gitosis;

•要像SVN那樣變态地控制權限,用Gitolite。

期末總結

終于到了期末總結的時刻了!

經過幾天的學習,相信你對Git已經初步掌握。一開始,可能覺得Git上手比較困難,尤其是已經熟悉SVN的童鞋,沒關系,多操練幾次,就會越用越順手。

Git雖然極其強大,指令繁多,但常用的就那麼十來個,掌握好這十幾個常用指令,你已經可以得心應手地使用Git了。

友情附贈國外網友制作的Git Cheat Sheet,建議列印出來備用:

Git Cheat Sheet

現在告訴你Git的官方網站:http://git-scm.com,英文自我感覺不錯的童鞋,可以經常去官網看看。什麼,打不開網站?相信我,我給出的絕對是官網位址,而且,Git官網決沒有那麼容易當機,可能是你的人品問題,趕緊面壁思過,好好想想原因。

如果你學了Git後,工作效率大增,有更多的空閑時間健身看電影,那我的教學目标就達到了。

謝謝觀看!