1. 程式人生 > >git命令行(4)其他

git命令行(4)其他

git

一.忽略文件

1.文件分類

git將所有文件分成三類:已追蹤的、被忽略的以及未追蹤的。

  • 已追蹤的:表示已經存在版本庫中的,或者以暫存到暫存區的
  • 被忽略的:在忽略文件中配置的忽略文件
  • 位追蹤的:出去上面的兩類,例如新增的工作區的文件

2. gitignore文件

可以在gitignore中配置忽略文件,其格式如下:

  • 空行被忽略,使用#號作為註釋
  • 簡單的字面文件名匹配文件夾 例如target可以匹配target目錄
  • 以/結尾可以忽略整個目錄下的所有文件,例如target/ bin/可以忽略構建的文件
  • 可以包含shell通配符,如星號(*) 例如*.log忽略所有的log文件
  • 起始的感嘆號會對其余部分的模式取反

由於gitignore文件可以在很多地方配置,因此其有優先級,優先級由高到低如下:

    • 命令行上指定的模式
    • 在相同目錄的.gitignore文件
    • 上層目錄中的模式,最接近當前目錄的上層模式的優先級高於更上層的模式
    • 來自.git/info/exclude文件的模式
    • 來自配置變量core.excludefile指定文件中的模式

一般開發中,都會在代碼庫的工作區跟目錄指定.gitignore文件

二、補丁

對於有些網絡不通獲取其他情況,需要使用補丁來合並代碼。git提供了三個特定命令來幫助交換補丁

1.format-patch

format-patch命令會以郵件消息的形式生成一個補丁,每個提交都是一個相對於上個提交的補丁文件。用法如下:

git format-patch -2 -------------最近的兩次提交,生成兩個補丁文件
git format-patch master~4..master~2  -----特定的範圍

2.郵遞補丁

補丁文件生成好以後需要發送補丁文件,你可以直接通過個人郵箱以附件的形式發送,不過git提供了send-email命令來直接發送補丁文件。例如:
git send-email -to [email protected] 0001-A.patch
但是你需要配置你的郵箱的SMTP服務器的地址和端口號才行:
git config --global sendemail.smtpserver smtp.my-isp.com

git config --global sendemail.smtpserverport 465

可以通過查詢郵箱的smtp服務器來配置,一般在郵箱的設置選項裏面可以看到smtp服務器地址,例如網易的免費郵如下:

郵箱 POP3 服務器(端口110) SMTP 服務器(端口25)
188.com pop3.188.com smtp.188.com
163.com pop3.163.com smtp.163.com
126.com pop3.126.com smtp.126.com
netease.com pop.netease.com smtp.netease.com
yeah.net pop.yeah.net smtp.yeah.net

3.應用補丁

可以使用git am命令來應用補丁,
git am /temp/0001-B.patch

三、鉤子

當git出現版本庫如提交或者推送事件的時候,會觸發鉤子(特定的腳本),鉤子中可以處理其他的一些事情,例如觸發CI構建,或者決定事件是否有效,例如提交的日誌不符合一定的格式,不能提交。
git的鉤子只屬於特定的版本庫,在clone操作的時候並不能復制。也就是每個開發人員都需要設置通過復制文件的形式把鉤子腳本copy到.git/hooks目錄
一般鉤子分成兩種:

  • 前置鉤子(pre):這種鉤子會在動作完成前調用,例如提交前通過非零狀態退出,那麽就會拒絕該事件
  • 後置鉤子(post):會在動作完成前調用,常用來出發通知(郵件、CI),通常其退出狀態會忽略。

在.git/hooks目錄下,預制了很多鉤子樣例文件,直接把相應文件的.sample後綴去除就是一個鉤子文件。提交鉤子的流程如下:

pre-commit hook -----------------可以使用--no-verify屏蔽,這個鉤子腳本調用的時候沒有入參,因此只能通過git diff --cache命令來獲得提交的內容,然後進行判斷
 |
V
commit-msg hook -------------可以使用--no-verify屏蔽,這個鉤子腳本只有一個參數,即.git/COMMIT_EDITMSG文件的路徑位置。用戶可以通過讀取這個文件來對提交的日誌進行一些校驗
 |
V
actully do the commit
 |
V
post-commit hook --------------沒有入參

可以使用git help hooks命令來查看當前版本支持的鉤子。

四、git管理命令

1.打包文件

通過git 的對象可以知道,每次提交存儲的都是一個完整的內容,而不是和上次提交的差異。這樣如果對應比較大的文件,而每次提交對該文件做了小小的改動,會導致對象庫裏面存儲效率很低。
為了解決這種存儲效率低的問題,git提供了一種打包文件,git首先定位內容非常相似的全部文件,然後為他們之一存儲整個文件內容,之後計算相似文件之間的差異並且只存儲差異。
打包文件在.git\objects\pack目錄下面。

2.GC

git對象庫中可能存在大量的未引用的文件,例如git reset命令、git filter-branch命令。如果版本庫中有很多的松散對象,執行git reflog expire命令是,都會觸發git gc或者手動觸發gc命令,那麽就會清理對象庫中的文件

3.filter-branch

filter-branch命令是一個比較重量級的命令,可以通過自定義的命令來利用它操作不同的git對象,從而重寫分支上的提交。
其具體應用如下:
1、修改author和committer,當我們想把代碼庫公開的時候,但是想替換每個提交的作者和郵箱地址,那麽可以使用如下的命令:

$ git filter-branch --commit-filter ‘
        if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
        then
                GIT_AUTHOR_NAME="Scott Chacon";
                GIT_AUTHOR_EMAIL="[email protected]";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi‘ HEAD

2、每一個提交移除一個文件
這經常發生。 有人粗心地通過 git add . 提交了一個巨大的二進制文件,你想要從所有地方刪除它。 可能偶然地提交了一個包括一個密碼的文件,然而你想要開源項目。 filter-branch 是一個可能會用來擦洗整個提交歷史的工具。 為了從整個提交歷史中移除一個叫做 passwords.txt 的文件,可以使用 --tree-filter 選項給 filter-branch:

$ git filter-branch --tree-filter ‘rm -f passwords.txt‘ HEAD

Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21)
Ref ‘refs/heads/master‘ was rewritten
--tree-filter 選項在檢出項目的每一個提交後運行指定的命令然後重新提交結果。 在本例中,你從每一個快照中移除了一個叫作 passwords.txt 的文件,無論它是否存在。 如果想要移除所有偶然提交的編輯器備份文件,可以運行類似 git filter-branch --tree-filter ‘rm -f *~‘ HEAD 的命令。

最後將可以看到 Git 重寫樹與提交然後移動分支指針。 通常一個好的想法是在一個測試分支中做這件事,然後當你決定最終結果是真正想要的,可以硬重置 master 分支。 為了讓 filter-branch 在所有分支上運行,可以給命令傳遞 --all 選項。

4.具體問題

1.版本庫合並

對於代碼庫合並可以使用如下的步驟:

1、git remote add anoterURL ------------使用git remote命令添加其他倉庫的url
2、git pull anoternURL     --allow-unrelated-histories    ------------使用git pull命令拉取其他倉庫的代碼,註意要使用--allow-unrelated-histories

而如果需要把其他的代碼庫檢查到當前代碼庫的某個子目錄,需要使用協同模型---子樹合並的方式,請參考後續的博客。

2.windows下載代碼路徑超過256字符

在windows下經常使用git clone命令或者checkout命令的時候,由於需要檢查的代碼路徑超過了256導致失敗,這時可以增加core.longpaths配置來解決。例如:
git config core.longpaths true
如果該配置設置以後仍然不能生效,那麽需要檢查一下你的git版本是否過低,把git升級到新版本就可以了,因為這個參數配置也是需要git高版本才能生效。

git命令行(4)其他