2010-04-22 129 views
24

我有一個分支(讓我們稱之爲B)忽略某個文件,其中不是在某些其他分支(例如分支A)中被忽略。當我從分支B切換到分支A,然後再次回到B時,文件已被刪除。當我切換分支時Git正在刪除一個被忽略的文件

這是正常的嗎?我可以看出它是如何發生的,因爲分支B認爲它不在那裏,而分支A認爲它是這樣的,所以當我回到B時它會「清除它」。但它有點煩人。

有什麼建議嗎?

+0

是否有理由不能在所有分支中忽略它或將它包含在所有分支中? – ewall 2010-04-22 14:57:16

+0

這裏有一個有趣的問題:如果您將它添加到分支A上的.gitignore,然後想要將其添加到分支B上的.gitignore,則必須簽出分支B,在該點刪除文件 - 在您擁有有機會忽略它。你可能需要在你的工作目錄中有一個髒的.gitignore,*當你切換分支時包含文件*以避免文件被刪除。 – Armand 2010-04-22 15:41:01

+0

@艾莉森G:你的情況沒有多大意義。爲了實現這一切,必須在分支A上對文件進行跟蹤*。因此,您不會將其添加到分支A上的gitignore中。由於文件在一個分支上被跟蹤,並且不存在另一個。忽略它的唯一影響是允許您從B到A,而不會被警告您覆蓋工作樹中的文件。 – Cascabel 2010-04-22 17:04:28

回答

2

這很正常,雖然我有點驚訝的一步。

當你從B切換到A時,git發現文件必須更新以匹配A的版本,並且默默地執行,因爲你已經忽略了它,說到分支B而言,文件沒有'沒關係。它必須這樣做 - 唯一的選擇是拒絕檢出分支A.(如果文件沒有被忽略,它會拒絕,並說「未經操作的工作樹文件」會被合併覆蓋「我真的很驚訝在這種情況下它也沒有這樣做任何人都有任何洞察力,這是否是功能或錯誤?)

當你切換回,git看到分支B沒有該文件,並將其刪除。再次,它必須這樣做。它沒有辦法讀你的思想,並意識到忽略文件在那一分鐘前是你想要的 - 它只是給你分支B的內容,它指出文件不存在。

正如ewall在評論中所建議的那樣,如果您希望文件在這些轉換中生存下來,它需要被所有分支跟蹤,或者在所有分支中被忽略。

4

由於唯一可行的辦法是跟蹤在任何時候文件「f」,你可以添加,只有在分支B,一個smudge/clean processgitattributes filter driver

https://raw.github.com/adisp007/ProGit/master/figures/18333fig0702-tn.png

當checkouting分支B

  • 塗抹過程中會改變:

    • 保存f內容在一個臨時文件
    • 替換f一個fbis文件中的內容(一個跟蹤文件,該文件將包含分支B的「B內容的f」)
  • 清潔工藝將:

    • 節省f在的內容(如修改B
    • 恢復f內容(與臨時文件)(fbis獲取與分支Bf修改承諾),這意味着f不承諾(在B忽略)

您可以添加,仍處於分支B,一個custom merge driver它將保護fbis從其他分支合併到B
合併驅動程序將始終保留B版本的fbis內容,確保忽略的文件f在分支B被簽出時取回其內容。

由於這些驅動程序(過濾器和合並)未在其他分支中提交,文件'f'在其他分支中進行了所有修改。
在分支B中,其內容將永遠不會改變,但只要登出B,對f所做的「本地修改」仍會恢復。

如果不需要恢復內容,則無需管理fbis
只需保留過濾器驅動程序,您將確保無論您對f分支B所做的任何修改,這些更改都不會被提交,實際上將忽略f內容。

+2

哇,@VonC這是一個了不起的答案,非常感謝。我不確定我是否足夠聰明來理解它,但是......需要另一杯咖啡...... – 2010-04-28 08:46:32

+0

或者對於每個分支都有兩個單獨的工作目錄,並完全避免檢出問題......類似於SVN這就是我所做的分支模型。在不相關的記錄上有一段有趣的歷史記錄:http://blog.red-bean.com/sussman/?p=20 – 2016-09-23 18:29:26

+0

@DanielSokolowski這實際上可能是自Git 2.5以來:http://stackoverflow.com/a/39626426/6309和http://stackoverflow.com/a/30185564/6309 – VonC 2016-09-23 20:12:38

0

我已經經歷了類似的情況,我這樣做:

我會打電話給其在的index.php結賬刪除的文件。

在你的。支路A支路B的gitignore除去忽略你的index.php行,在此之後提交您的.gitignore在兩個分支。

分支A,創建備份index.php,刪除並提交。

恢復在分支一的index.php從備份以前創建並在您的.gitignore再次忽略的index.php並提交此。

在你支路B添加的index.php,忽略你的.gitignore文件,提交和快樂。

+0

不適合我。 – blinry 2012-11-30 12:11:59

1

在git中忽略文件並不意味着它們沒有修改。您可以在git中檢入並管理文件,並在.gitignore中忽略它。

相關問題