『現學現忘』Git基礎 — 20、Git中忽略文件補充
- 2022 年 5 月 5 日
- 筆記
- 高級測試技能 - Git基礎
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, --force
:Allow 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檢查忽略規則的時候有多個來源,它的優先級如下(由高到低):
- 從命令行中讀取可用的忽略規則。
- 當前目錄定義的規則(
.gitingore
文件)。 - 父級目錄定義的規則,依次遞推,目錄結構較高的
.gitignore
文件將被較近的.gitignore
文件中相同的配置所覆蓋(.gitingore
文件)。 .git/info/exclude
文件中定義的規則。core.excludesfile
中定義的全局規則。
3、忽略已跟蹤文件的改動(本機使用)
(1)需求說明
之前的忽略方案,都是適用於未跟蹤文件的忽略,而對於已跟蹤(track
)文件的改動並不適用,好在針對這種情況,Git也提供了我們方法去忽略。
換句話說,就是添加忽略之後,修改已經提交到版本庫中的文件是無法忽略的。
即:
.gitignore
只能忽略那些原來沒有被track
的文件,如果某些文件已經被納入了版本管理中,則修改.gitignore
是無效的。
(2)處理步驟
自己思考的方式:(稀爛哈哈)
- 將項目
clone
到本地。 - 刪除項目中的忽略配置,如:根目錄中的
.gitignore
文件。 - 然後在創建新的
.gitignore
文件,重新配置忽略。
正確的做法:
clone
下來的倉庫中手動設置,不要檢查特定文件的更改情況。
執行命令如下:# 忽略跟蹤(提交代碼時,忽略某一個文件不提交,即某個文件不被版本控制) # file-path是目標文件路徑 git update-index --assume-unchanged file-path # 恢復跟蹤 git update-index --no-assume-unchanged file-path
這樣已經在本地版本庫中的文件修改之後,也可以被忽略。
不過如果執行git checkout
(切換分支)和git reset
(回退版本)命令的時候仍然會影響到這些文件,並把內容恢復到被跟蹤的內容(再次執行上面命令,修改仍然不會被跟蹤)。- 另一種方式:
Git還提供了另一種exclude
的方式來做同樣的事情,就是之前說過的在本地版本庫中的.git/info/exclude
文件中配置忽略,這裡設置的忽略規則是你自己本地需要排除的文件, 他不會影響到其他人,也不會提交到版本庫中去。
4、autocrlf和safecrlf參數說明
(1)提出問題
我們在配置全局忽略.gitconfig
文件的時候,可能會看到如下配置:
[core]
autocrlf = true
safecrlf = false
excludesfile = C:/Users/L/gitignore_global.txt
那麼autocrlf = true
和safecrlf = false
是什麼意思?
LF
是Linux系統下的換行符,而CRLF
是Windows系統下的換行符。由於我們的文件創建於Linux系統下(Git Bash中創建),而保存中Windows系統中,所以文件中的行結束符,要使用Windows下的CRLF
格式換行,而在Git中的默認配置是自動轉換。
因為在Git的忽略文件中,是一行一行的忽略規則,而autocrlf
和safecrlf
就是對轉變換行格式的具體配置。
(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
參考: