溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

git忽略文件追蹤的方式有哪些

發(fā)布時(shí)間:2022-01-05 09:21:09 來源:億速云 閱讀:118 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“git忽略文件追蹤的方式有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“git忽略文件追蹤的方式有哪些”吧!

git忽略追蹤文件包括兩種,一種是未提交到git倉(cāng)庫(kù)的文件,一種是已經(jīng)提交到git倉(cāng)庫(kù)中的文件。

一、忽略追蹤未提交到git倉(cāng)庫(kù)的文件

    將忽略追蹤的文件路徑寫到倉(cāng)庫(kù)根目錄下的.gitignore文件中即可

二、忽略追蹤已經(jīng)提交到git倉(cāng)庫(kù)中的文件

方案一、在每個(gè)clone下來的倉(cāng)庫(kù)中手動(dòng)設(shè)置不要檢查特定文件的更改情況

    git update-index --assume-unchanged filename

方案二、直接刪除對(duì)應(yīng)文件的跟蹤(實(shí)際操作測(cè)試有些問題,不建議使用,詳見誤區(qū)說明)

    操作步驟如下:

    1、git rm --cached path/to/xxx.file

    2、更新 .gitignore 忽略掉目標(biāo)文件

    3、git commit -m "We really don't want Git to track this anymore!"

    誤區(qū)說明:這種操作下,clone最新版的代碼,將無法得到被rm --cached忽略的文件。

    解決方案如下:

1、復(fù)制出一份被忽略前的代碼  
cp -rv source.git tmp/  
2、進(jìn)入復(fù)制的代碼庫(kù)中,恢復(fù)到忽略前的版本  
cd tmp/source.git  
git reset --hard e496b8b6d3851  
3、將忽略的文件拷貝到當(dāng)前倉(cāng)庫(kù)中,不要覆蓋.git文件夾  
\cp -rv tmp/source.git/src/* source.git/src/    

4、保留忽略的文件,將其他文件更新至最新

附錄


方案一說明:

.gitignore只能忽略那些原來沒有被track的文件,如果某些文件已經(jīng)被納入了版本管理中,則修改.gitignore是無效的。
正確的做法是在每個(gè)clone下來的倉(cāng)庫(kù)中手動(dòng)設(shè)置不要檢查特定文件的更改情況。

git update-index --assume-unchanged PATH    # 在PATH處輸入要忽略的文件。

另外 git 還提供了另一種 exclude 的方式來做同樣的事情,不同的是 .gitignore 這個(gè)文件本身會(huì)提交到版本庫(kù)中去。用來保存的是公共的需要排除的文件。而 .git/info/exclude 這里設(shè)置的則是你自己本地需要排除的文件。 他不會(huì)影響到其他人。也不會(huì)提交到版本庫(kù)中去。

.gitignore 還有個(gè)有意思的小功能, 一個(gè)空的 .gitignore 文件 可以當(dāng)作是一個(gè) placeholder 。當(dāng)你需要為項(xiàng)目創(chuàng)建一個(gè)空的 log 目錄時(shí), 這就變的很有用。 你可以創(chuàng)建一個(gè) log 目錄 在里面放置一個(gè)空的 .gitignore 文件。這樣當(dāng)你 clone 這個(gè) repo 的時(shí)候 git 會(huì)自動(dòng)的創(chuàng)建好一個(gè)空的 log 目錄了。


方案二說明:

具體的原因如下:

被采納的答案雖然能達(dá)到(暫時(shí)的)目的,但并非最正確的做法,這樣做是誤解了 git update-index 的含義,而且這樣做帶來的最直接(不良)后果是這樣的:

  1. 所有的團(tuán)隊(duì)成員都必須對(duì)目標(biāo)文件執(zhí)行:git update-index --assume-unchanged <PATH>。這是因?yàn)榧词鼓阕?Git 假裝看不見目標(biāo)文件的改變,但文件本身還是在 Git 的歷史記錄里的,所以團(tuán)隊(duì)的每個(gè)人在 fetch 的時(shí)候都會(huì)拉到目標(biāo)文件的變更。(但實(shí)際上目標(biāo)文件是根本不想被 Git 記錄的,而不是假裝看不見它發(fā)生了改變)

  2. 一旦有人改變目標(biāo)文件之后沒有 git update-index --assume-unchanged <PATH> 就直接 push 了,那么接下來所有拉取了最新代碼的成員必須重新執(zhí)行 update-index,否則 Git 又會(huì)開始記錄目標(biāo)文件的變化。這一點(diǎn)實(shí)際上很常見的,比如說某成員換了機(jī)器或者硬盤,重新 clone 了一份代碼庫(kù),由于目標(biāo)文件還在 Git 的歷史記錄里,所以他/她很可能會(huì)忘記 update-index。

為什么會(huì)這樣?答案就在 Git 的 man pages 里:

首先,git update-index 的定義是:

Register file contents in the working tree to the index(把工作區(qū)下的文件內(nèi)容注冊(cè)到索引區(qū))

這句話暗含的意思是:update-index 針對(duì)的是 Git 數(shù)據(jù)庫(kù)里被記錄的文件,而不是那些需要忽略的文件。

接著看關(guān)于 --assume-unchanged 的幾句相關(guān)的描述:

When the "assume unchanged" bit is on, Git stops checking the working tree files for possible modifications, so you need to manually unset the bit to tell Git when you change the working tree file. This is sometimes helpful when working with a big project on a filesystem that has very slow lstat(2) system call (e.g. cifs).

大致意思是:

應(yīng)用了該標(biāo)識(shí)之后,Git 停止查看工作區(qū)文件可能發(fā)生的改變,所以你必須 手動(dòng) 重置該標(biāo)識(shí)以便 Git 知道你想要恢復(fù)對(duì)文件改變的追蹤。當(dāng)你工作在一個(gè)大型項(xiàng)目中,這在文件系統(tǒng)的 lstat 系統(tǒng)調(diào)用非常遲鈍的時(shí)候會(huì)很有用。

我們知道 Git 不僅僅是用來做代碼版本管理的,很多其他領(lǐng)域的項(xiàng)目也會(huì)使用 Git。比如說我公司曾經(jīng)一個(gè)客戶的項(xiàng)目涉及到精密零件圖紙文檔的版本管理,他們也用 Git。有一種使用場(chǎng)景是對(duì)一些體積龐大的文件進(jìn)行修改,但是每一次保存 Git 都要計(jì)算文件的變化并更新工作區(qū),這在硬盤慢的時(shí)候延遲卡頓非常明顯。

git update-index --assume-unchanged 的真正用法是這樣的:

  1. 你正在修改一個(gè)巨大的文件,你先對(duì)其 git update-index --assume-unchanged,這樣 Git 暫時(shí)不會(huì)理睬你對(duì)文件做的修改;

  2. 當(dāng)你的工作告一段落決定可以提交的時(shí)候,重置改標(biāo)識(shí):git update-index --no-assume-unchanged,于是 Git 只需要做一次更新,這是完全可以接受的了;

  3. 提交+推送。

另外,根據(jù)文檔的進(jìn)一步描述:

This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to what .gitignore does for untracked files).

這段描述告訴我們兩個(gè)事實(shí):

  1. 雖然可以用其來達(dá)成樓主想要的結(jié)果,但這是不講究的做法(coarse);

  2. 同樣的事情更應(yīng)該用 .gitignore 文件來實(shí)現(xiàn)(針對(duì)未追蹤的文件)。

隨之而來的問題是:為什么我增加了 .gitignore 里的規(guī)則卻沒有效果?

這是因?yàn)槲覀冋`解了 .gitignore 文件的用途,該文件只能作用于 Untracked Files,也就是那些從來沒有被 Git 記錄過的文件(自添加以后,從未 add 及 commit 過的文件)。

之所以你的規(guī)則不生效,是因?yàn)槟切?nbsp;.log 文件曾經(jīng)被 Git 記錄過,因此 .gitignore 對(duì)它們完全無效。這也正是開頭那段簡(jiǎn)短答案所做的事情:

  1. 從 Git 的數(shù)據(jù)庫(kù)中刪除對(duì)于該文件的追蹤;

  2. 把對(duì)應(yīng)的規(guī)則寫入 .gitignore,讓忽略真正生效;

  3. 提交+推送。

只有這樣做,所有的團(tuán)隊(duì)成員才會(huì)保持一致而不會(huì)有后遺癥,也只有這樣做,其他的團(tuán)隊(duì)成員根本不需要做額外的工作來維持對(duì)一個(gè)文件的改變忽略。

最后有一點(diǎn)需要注意的,git rm --cached 刪除的是追蹤狀態(tài),而不是物理文件;如果你真的是徹底不想要了,你也可以直接 rm+忽略+提交。

感謝各位的閱讀,以上就是“git忽略文件追蹤的方式有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)git忽略文件追蹤的方式有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

git
AI