2011-05-23 67 views
37

下面是這種情況:的git更新索引--assume,不變和git重置

在我的工作目錄,我有大量的文件(讓我們稱他們爲A,B,C),我已經編輯。然後我在這些文件上運行git update-index --assume-unchanged。現在git status返回空白。好。

現在,如果我做了一個git reset --hard,文件A,B和C的內容在我編輯它們之前還原爲它們的內容並且「承擔 - 不變」它們。

有沒有辦法阻止Git實際恢復文件A,B和C,並簡單地忽略它們?

感謝,

+0

嗯,很好的問題。我不知道答案,但是也許你可以寫一個腳本來完成這三個文件的簽出,然後將它用作重置動作的後動作鉤子,以便它們被覆蓋。 – MatrixFrog 2011-05-24 01:39:43

回答

44

你可以這樣做:

git update-index --skip-worktree A 
+0

好!這樣可行。我現在唯一的問題是Eclipse的git插件(egit)無法處理--skip-worktree ... Grr。 – 2011-05-24 16:39:28

+0

請注意,如果啓用了[稀疏結帳](https://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_sparse_checkout),則此設置將被覆蓋,你應該使用'sparse-checkout'文件來忽略有問題的文件。 – AndreKR 2013-06-12 20:03:54

+0

不是使用'sparse-checkout'文件結果不僅忽略,而且自動刪除這些文件? – Powerman 2015-01-21 12:24:12

1

您需要添加一個.gitignore文件條目這些文件,如果你想忽略它們。只添加.gitignore文件,提交它,現在您將忽略對它們的任何更改。但是,我認爲你需要告訴我們你爲什麼要這樣做,文件的內容是什麼,它們的性質(它們是否是工件?) - 然後你會得到正確的答案。

而且,update-indexassume-unchanged是爲了使用,如果你的你的操作系統的文件系統上樹需要很長的時間來收集特定路徑的改變來提高性能。我不建議在你的情況下使用它,除非由於冗長的git statusgit diff或其他命令執行時間而忽略這些文件。

+1

文件A,B和C實際上是unix符號鏈接文件,它們被簽出到Windows系統中。由於Windows無法使用unix符號鏈接,因此git會將它們轉換爲純文本文件。然後我的腳本運行並找到這些「虛擬」文件,並用windows符號鏈接替換它們。如果我在這裏做git status,那麼我的A,B和C處於修改狀態。但是,我想要改變A,B,C幾乎永遠不會被忽略。 git update-index --assume-unchanged很好,除非發出git reset。因此,這個問題。希望這個澄清事情有點=) – 2011-05-24 16:33:20

1

你可以使用

$ git stash 
$ git reset --hard 
$ git stash pop