『現學現忘』Git基礎 — 20、Git中忽略檔案補充

繁華似錦Fighting發表於2022-05-05

1、忽略檔案常遇到的問題

有些時候,你想新增一個檔案到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本地版本庫:

關於-f引數,描述如下:

-f, --forceAllow adding otherwise ignored files.允許新增被忽略的檔案。

$ git add -f App.class

或者你發現,可能是.gitignore寫得有問題,需要找出來到底哪個規則寫錯了,可以用git check-ignore命令檢查:

$ git check-ignore -v App.class
.gitignore:3:*.class	App.class

Git會告訴我們,.gitignore的第3行規則忽略了該檔案,於是我們就可以知道應該修訂哪個規則。

還有些時候,當我們編寫了規則排除了部分檔案時:

# 排除所有.開頭的隱藏檔案:
.*
# 排除所有.class檔案:
*.class

但是我們發現.*這個規則把.gitignore也排除了,並且App.class需要被新增到版本庫,但是被*.class規則排除了。

雖然可以用git add -f強制新增進去,但有強迫症的童鞋還是希望不要破壞.gitignore規則,這個時候,可以新增兩條例外規則:

# 排除所有.開頭的隱藏檔案:
.*
# 排除所有.class檔案:
*.class

# 不排除.gitignore和App.class:
!.gitignore
!App.class

把指定檔案排除在.gitignore規則外的寫法就是!+檔名,所以,只需把例外檔案新增進去即可。

小結

  • 忽略某些檔案時,需要編寫.gitignore檔案。
  • .gitignore檔案本身要放到版本庫裡,並且可以對.gitignore做版本管理。
  • 可以不提交到本地版本庫或遠端倉庫,只對本地副本有效。
  • 可以提交到遠端倉庫,對所有clone下來的版本庫生效。(所以個人特殊忽略不要在這裡新增)

2、忽略檔案配置優先順序

Git檢查忽略規則的時候有多個來源,它的優先順序如下(由高到低):

  1. 從命令列中讀取可用的忽略規則。
  2. 當前目錄定義的規則(.gitingore檔案)。
  3. 父級目錄定義的規則,依次遞推,目錄結構較高的.gitignore檔案將被較近的.gitignore檔案中相同的配置所覆蓋(.gitingore檔案)。
  4. .git/info/exclude檔案中定義的規則。
  5. core.excludesfile中定義的全域性規則。

3、忽略已跟蹤檔案的改動(本機使用)

(1)需求說明

之前的忽略方案,都是適用於未跟蹤檔案的忽略,而對於已跟蹤(track)檔案的改動並不適用,好在針對這種情況,Git也提供了我們方法去忽略。

換句話說,就是新增忽略之後,修改已經提交到版本庫中的檔案是無法忽略的。

即:.gitignore只能忽略那些原來沒有被track的檔案,如果某些檔案已經被納入了版本管理中,則修改.gitignore是無效的。

(2)處理步驟

自己思考的方式:(稀爛哈哈)

  1. 將專案clone到本地。
  2. 刪除專案中的忽略配置,如:根目錄中的.gitignore檔案。
  3. 然後在建立新的.gitignore檔案,重新配置忽略。

正確的做法:

  1. clone下來的倉庫中手動設定,不要檢查特定檔案的更改情況。
    執行命令如下:
    # 忽略跟蹤(提交程式碼時,忽略某一個檔案不提交,即某個檔案不被版本控制)
    # file-path是目標檔案路徑 
    git update-index --assume-unchanged file-path
    
    # 恢復跟蹤
    git update-index --no-assume-unchanged file-path
    
    這樣已經在本地版本庫中的檔案修改之後,也可以被忽略。
    不過如果執行 git checkout(切換分支)和git reset(回退版本)命令的時候仍然會影響到這些檔案,並把內容恢復到被跟蹤的內容(再次執行上面命令,修改仍然不會被跟蹤)。
  2. 另一種方式:
    Git還提供了另一種exclude的方式來做同樣的事情,就是之前說過的在本地版本庫中的.git/info/exclude檔案中配置忽略,這裡設定的忽略規則是你自己本地需要排除的檔案, 他不會影響到其他人,也不會提交到版本庫中去。

4、autocrlf和safecrlf引數說明

(1)提出問題

我們在配置全域性忽略.gitconfig檔案的時候,可能會看到如下配置:

[core]
    autocrlf = true
    safecrlf = false
    excludesfile = C:/Users/L/gitignore_global.txt

那麼autocrlf = truesafecrlf = false是什麼意思?

LF是Linux系統下的換行符,而CRLF是Windows系統下的換行符。由於我們的檔案建立於Linux系統下(Git Bash中建立),而儲存中Windows系統中,所以檔案中的行結束符,要使用Windows下的CRLF格式換行,而在Git中的預設配置是自動轉換。

因為在Git的忽略檔案中,是一行一行的忽略規則,而autocrlfsafecrlf就是對轉變換行格式的具體配置。

(2)autocrlf說明

  • autocrlf = true:表示要求Git在提交時將CRLF轉換為LF,而在檢出時將LF轉換為CRLF
  • autocrlf = false:在提交與檢出程式碼的時候均不對換行符進行轉換。
  • autocrlf = input:表示在提交時將CRLF轉換為LF,而檢出時不轉換。

以上可手動配置在.gitconfig檔案中,

使用命令列配置如下:

# 提交時轉換為LF,檢出時轉換為CRLF
git config --global core.autocrlf true

# 提交時轉換為LF,檢出時不轉換
git config --global core.autocrlf input 

# 提交檢出均不轉換換行格式
git config --global core.autocrlf false

提示:當git add遇到fatal: LF would be replaced by CRLF或者fatal: CRLF would be replaced by LF的錯誤時,我們就需要考慮autocrlf引數的配置了。

建議:

Windows:(true)

提交時,將CRLF 轉成LF再提交。

切出時,自動將LF轉為CRLF

MAC/Linux: (input)

提交時, 將CRLF轉成LF再提交。

切出時,保持LF即可。

這樣即可保證倉庫中永遠都是LF, 而且在Windows工作空間都是CRLF,在Mac/Linux工作空間都是LF

(3)safecrlf說明

  • autocrlf = ture:拒絕提交包含混合換行符的檔案。
  • autocrlf = false:允許提交包含混合換行符的檔案。
  • autocrlf = warn:提交包含混合換行符的檔案時給出警告。

以上可手動配置在.gitconfig檔案中,

使用命令列配置如下:

# 拒絕提交包含混合換行符的檔案
git config --global core.safecrlf true 

# 允許提交包含混合換行符的檔案
git config --global core.safecrlf false 

# 提交包含混合換行符的檔案時給出警告
git config --global core.safecrlf warn

參考:

相關文章