2010-04-01 149 views
2

我目前正在使用Subversion存儲庫,但我正在使用git在本地機器上工作。它使工作變得更容易,但是它也使得顛覆回購中的一些不良行爲非常明顯,並且給我造成了問題。使用Git處理顛覆操作:忽略對跟蹤文件的修改

拉下代碼後會有一些複雜的本地構建過程,它會創建(並且不幸地修改)一些文件。很明顯,這些更改並不意味着被提交回存儲庫。不幸的是,構建過程實際上是在修改一些跟蹤文件(是的,很可能是因爲有人錯誤地將這些構建工件提交給了Subversion存儲庫)。由於這些修改將它們添加到我的忽略文件中對我沒有任何幫助。

我可以避免檢查這些變化回來它,我簡單地不分階段或提交它們,但有未分離的本地更改意味着我不能先徹底清除它們,然後重新分配。

我想知道的是,是否有任何方法可以忽略對一組跟蹤文件的未來更改?另外,還有另一種方法來處理我遇到的問題,或者我只需告訴誰檢查了這些文件來清理它們?

回答

3

作爲Nathan said,清理這些文件(取消跟蹤它們)是明智之舉。

但如果你必須忽略跟蹤的文件(當它涉及到忽略文件,這是不是本地的Git方式:Git的只有忽略非跟蹤文件),你可以設置一個過程複製你想要的文件的內容忽略並恢復提交。

我最初相信,smudge/clean process,這是一個gitattributes filter driver可以做的伎倆:

alt text

,其中:

  • 塗抹過程將使這些文件的副本(當更新工作樹)
  • 在構建過程中發生一些修改
  • 的清潔步驟(期間提交)將刪除的文件的內容與第1步

,但正如stated in this post作出的副本,這將意味着濫用這一無國籍文件內容轉型加入了狀態上下文(即文件的完整路徑名被弄髒/乾淨)。
那就是明確JC濱野禁止:

雖然我最初認爲插值「%P」與路徑,我最終決定反對它,從濫用這一變化的結果取決於有狀態轉換過濾器阻止人們準時,路徑名,提交,分支和東西。

,並在有關的所有機制時也Linus Torvalds had some reservations

我不得不說,我顯然不玩遊戲的超級粉絲,但差異時非常乾淨。

它們實際上是有用嗎?我不知道。我對這個功能的任何實際用戶意味着什麼感到有點緊張,但我不得不承認被幹淨的實現所迷惑。

我懷疑這會讓我們有些抱怨,但我也懷疑人們會最終真的因爲這樣的事情而自責,然後責備我們,並在我們生活中造成巨大的痛苦支持這一點,人們希望「擴展語義」不再幹淨。

但我不知道真正的論證有多有效。我確實相信「給他們繩子」的理念。我想你也許可以這樣欺負自己莊嚴這個問題,但是,嘿,任何人誰做,只有具有咎由自取


所以正確的地方加入某種保存/恢復機制(和有效地忽略任何變化一組跟蹤在Git中文件)將是hooks

  • post-checkout:時調用更新工作樹後運行git checkout。在那裏你可以運行一個腳本收集所有的文件來忽略並保存在某個地方。

  • pre-commit:您可以獲取建議的提交日誌信息,並作出承諾之前運行將恢復這些文件的內容的第二腳本。

+0

我同意,我只是想要一個備份計劃,以防萬一這種情況不會發生。我必須使用存儲庫,但這些文件不是我的,我使用git來處理它。 – 2010-04-01 18:59:40

+0

我可以看到我將如何複製這些文件,但我不知道如何在乾淨的過濾器中引用文件名。有沒有一個變量呢? – 2010-04-02 00:02:01

+0

@Chris:在閱讀http://lists.zerezo.com/git/msg422632.html後,我不確定這個過濾器驅動程序是否是正確的工具,因爲J.C. Hamano希望它是無狀態的。 – VonC 2010-04-02 06:24:32

1

除非出現嚴重的政治性腦損傷,否則從源代碼控制中刪除工件是正確的步驟。 (或者說,「最有利」的一步,它總是正確的一步。)

我不知道有一種方法可以讓git忽略對跟蹤文件的更改。