我有一個分支(讓我們稱之爲B)忽略某個文件,其中不是在某些其他分支(例如分支A)中被忽略。當我從分支B切換到分支A,然後再次回到B時,文件已被刪除。當我切換分支時Git正在刪除一個被忽略的文件
這是正常的嗎?我可以看出它是如何發生的,因爲分支B認爲它不在那裏,而分支A認爲它是這樣的,所以當我回到B時它會「清除它」。但它有點煩人。
有什麼建議嗎?
我有一個分支(讓我們稱之爲B)忽略某個文件,其中不是在某些其他分支(例如分支A)中被忽略。當我從分支B切換到分支A,然後再次回到B時,文件已被刪除。當我切換分支時Git正在刪除一個被忽略的文件
這是正常的嗎?我可以看出它是如何發生的,因爲分支B認爲它不在那裏,而分支A認爲它是這樣的,所以當我回到B時它會「清除它」。但它有點煩人。
有什麼建議嗎?
這很正常,雖然我有點驚訝的一步。
當你從B切換到A時,git發現文件必須更新以匹配A的版本,並且默默地執行,因爲你已經忽略了它,說到分支B而言,文件沒有'沒關係。它必須這樣做 - 唯一的選擇是拒絕檢出分支A.(如果文件沒有被忽略,它會拒絕,並說「未經操作的工作樹文件」會被合併覆蓋「我真的很驚訝在這種情況下它也沒有這樣做任何人都有任何洞察力,這是否是功能或錯誤?)
當你切換回,git看到分支B沒有該文件,並將其刪除。再次,它必須這樣做。它沒有辦法讀你的思想,並意識到忽略文件在那一分鐘前是你想要的 - 它只是給你分支B的內容,它指出文件不存在。
正如ewall在評論中所建議的那樣,如果您希望文件在這些轉換中生存下來,它需要被所有分支跟蹤,或者在所有分支中被忽略。
由於唯一可行的辦法是跟蹤在任何時候文件「f
」,你可以添加,只有在分支B
,一個smudge/clean process與gitattributes filter driver:
當checkouting分支B
:
塗抹過程中會改變:
f
內容在一個臨時文件f
一個fbis
文件中的內容(一個跟蹤文件,該文件將包含分支B
的「B
內容的f
」)清潔工藝將:
f
在的內容(如修改B
)f
內容(與臨時文件)(fbis
獲取與分支B
f
修改承諾),這意味着f
不承諾(在B
忽略)您可以添加,仍處於分支B
,一個custom merge driver它將保護fbis
從其他分支合併到B
:
合併驅動程序將始終保留B
版本的fbis
內容,確保忽略的文件f
在分支B
被簽出時取回其內容。
由於這些驅動程序(過濾器和合並)未在其他分支中提交,文件'f'在其他分支中進行了所有修改。
在分支B
中,其內容將永遠不會改變,但只要登出B
,對f
所做的「本地修改」仍會恢復。
如果不需要恢復內容,則無需管理fbis
。
只需保留過濾器驅動程序,您將確保無論您對f
分支B
所做的任何修改,這些更改都不會被提交,實際上將忽略f
內容。
哇,@VonC這是一個了不起的答案,非常感謝。我不確定我是否足夠聰明來理解它,但是......需要另一杯咖啡...... – 2010-04-28 08:46:32
或者對於每個分支都有兩個單獨的工作目錄,並完全避免檢出問題......類似於SVN這就是我所做的分支模型。在不相關的記錄上有一段有趣的歷史記錄:http://blog.red-bean.com/sussman/?p=20 – 2016-09-23 18:29:26
@DanielSokolowski這實際上可能是自Git 2.5以來:http://stackoverflow.com/a/39626426/6309和http://stackoverflow.com/a/30185564/6309 – VonC 2016-09-23 20:12:38
我已經經歷了類似的情況,我這樣做:
我會打電話給其在的index.php結賬刪除的文件。
在你的。支路A和支路B的gitignore除去忽略你的index.php行,在此之後提交您的.gitignore在兩個分支。
分支A,創建備份index.php,刪除並提交。
恢復在分支一的的index.php從備份以前創建並在您的.gitignore再次忽略的index.php並提交此。
在你支路B添加的index.php,忽略你的.gitignore文件,提交和快樂。
不適合我。 – blinry 2012-11-30 12:11:59
在git中忽略文件並不意味着它們沒有修改。您可以在git中檢入並管理文件,並在.gitignore
中忽略它。
是否有理由不能在所有分支中忽略它或將它包含在所有分支中? – ewall 2010-04-22 14:57:16
這裏有一個有趣的問題:如果您將它添加到分支A上的.gitignore,然後想要將其添加到分支B上的.gitignore,則必須簽出分支B,在該點刪除文件 - 在您擁有有機會忽略它。你可能需要在你的工作目錄中有一個髒的.gitignore,*當你切換分支時包含文件*以避免文件被刪除。 – Armand 2010-04-22 15:41:01
@艾莉森G:你的情況沒有多大意義。爲了實現這一切,必須在分支A上對文件進行跟蹤*。因此,您不會將其添加到分支A上的gitignore中。由於文件在一個分支上被跟蹤,並且不存在另一個。忽略它的唯一影響是允許您從B到A,而不會被警告您覆蓋工作樹中的文件。 – Cascabel 2010-04-22 17:04:28