【學了就忘】Git操作 — 56.忽略文件補充

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

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章