2011-05-11 63 views
22

我在某些文件上使用git update-index --assume-unchanged來保留我的更改以免被提交。如何防止git用「假定不變」位丟棄對文件的更改?

在存儲庫中使用git stash時,這些更改將與其他任何未完成的更改一起保留。這是預期的行爲,但git stash pop不會使他們回來,所以更改只是丟失。

任何人都知道如何防止assume unchanged位的文件將其更改隱藏起來?或者,您可能知道如何確保對這些文件進行的任何更改至少會被還原?

+0

Git存儲不會隱藏1.7.2中的更改。哪個版本的git? – 2011-05-11 14:23:30

+0

我的git版本是1.7.1。我會嘗試更新到1.7.2,看看是否修復它。 – 2011-05-11 15:43:25

+0

不幸的是,我仍然在Ubuntu上的git 1.7.5.1版本中看到這種行爲。 – 2011-05-16 11:25:48

回答

7

假設 - 不變是一種性能破壞,表示您承諾該文件沒有改變。如果你真的改變了文件,所有的投注都關閉。你應該重新構建你的repo,這樣你就不會提交這些文件(可能會提交filename.sample和.gitignore文件名),或者使用分支來玩技巧,這樣你不想與其他人分享的文件就不會與其他人共享分支或其他隱藏。

我曾見過/想過如何隱藏這些更改的四條建議。

1:使用塗抹/清潔過濾器將文件更改爲結帳時需要的內容,並在簽入時進行清理。醜陋。

2:創建一個本地配置分支,如http://thomasrast.ch/git/local-config.html中所述這裏要記住的關鍵是您在主分支上開發併合併到配置分支中進行測試。返回主分支進行更改,推送等。

3:創建一個私人開發分支,使您從不想共享的更改,然後進行假合併(git merge -s我們的privatebranch)。然後,您可以在您的私人分支上開發和測試,並且只要變更遠離您的正常工作,您不希望共享的變更就不應該在歸併時發生。但是,當您從上游獲得新的更改時,您需要將它們從上游直接拖入私有分支。然後,您從私有的後端合併到主服務器並從主服務器向上推。你絕對不能從主人合併回私人。同樣,你也絕對不可以變硬(好吧,可能rebase -p會起作用,但不能保證)。這些合併/重組以及每個必須發生的地方使得這種吸引力變小。

4:創建一個私人開發分支,讓你永遠不想分享的更改,然後創建一個合併驅動程序(請參閱man gitattributes),它將拒絕將有問題的文件從主人合併到私人或從私人到主人可能是通過將私有分支上的文件的SHA與各分支的SHA進行比較,如果匹配,則複製之前的值)。

+0

我給私人發展分支一去。我創建了一個私人分支,對我的私人更改進行了提交,然後切換回主分支並進行了「我們的」合併。然而,當我將主分支合併到私人分支時,它覆蓋了我的更改 – Casebash 2011-11-09 04:50:43

+0

@Casebash:您沒有完全描述發生了什麼,但我會猜測並說主分支更改了您更改的文件。這將確實會導致這些更改傳播到私人分支,一旦你合併主要私人。如果你也完全合併到main中,你可以'git checkout HEAD^- myfile'來重新獲得舊版本和merge -s。我們的目的是防止私人變更進入主體。沒有任何東西可以阻止主進入私人的新變化(除非該文件在一次提交中被更改)。 – 2011-11-09 15:33:09

+0

@Casebash:呃,我什麼都沒說,但我只記得git的一個整潔的功能。您可以定義一個自定義合併驅動程序,它將拒絕在合併期間進行任何更改。但是,合併驅動程序必須分支機構意識到。你不希望變化進入或退出私人狀態,但你*希望他們從原籍/主要進入主體。 – 2011-11-09 15:58:20