2014-02-19 145 views
16

在Xcode中,我注意到.DS_Store和* .xcuserstate總是變化,不需要被提交。所以,我寫了一個.gitignore文件,其中包含:從git中刪除.xcuserstate和DS_Store文件

.DS_Store 
*.xcuserstate 

等條目。然後我用:

git rm --cached *xcuserstate 
git rm ---cached .DS_Store 

刪除這些已經在版本控制下的文件類型。但是,當我去合併時,Xcode告訴我有需要提交的更改。這些更改包括.DS_Store文件和.xcuserstate文件。

所以,我嘗試這樣做:How can I Remove .DS_Store files from a Git repository?

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch 
find . -name *.xcuserstate -print0 | xargs -0 git rm --ignore-unmatch 

,我得到了相同的結果。如何從源代碼管理中刪除這些文件?

+0

我在提交Xcode的更改並在命令行中進行更改。出於某種原因,Xcode沒有正確提交。在從命令行顯式提交之後,它終於奏效了。我對兩個想要合併的分支做了更改,但現在Xcode告訴我,我無法合併,因爲「文件.gitignore有樹衝突。」 –

+0

再一次,命令行工作。我使用命令行進行了合併,一切正常。 –

回答

20

您需要在臨時區域取出之後,提交更改。

像你一樣已經運行:

$ git rm --cached path/to/.DS_Store 
$ git rm --cached *.xcuserstate 

注意,你可能有一些在其他目錄,所以你可能需要調用幾個讓他們所有。在這一點上,你的清除都在上演的指標,但還有更多的工作要做:添加.gitignore,並提交最終的結果:

$ git add .gitignore 
$ git commit -m "Remove and ignore .xcuserstate and .DS_Store files." 

現在,他們會從資源庫中刪除,並在忽略未來。注意:即使您在本地使用git rm --cached,這也會爲其他人刪除文件。不幸的是,關於這一點你可以做的不多。此外,這些文件仍然存在於您的歷史記錄中,因此根據您的操作,您可能會在其他分支中看到它們,直到合併並且所有分支機構都基於具有新提交的內容。

+2

您也可以使用git rm --cached * .DS_Store查找並刪除項目中的所有.DS_Store文件。 –

+2

您可能需要用引號將它包裹起來,以防止shell擴展它,並讓git做到這一點。另外,我通常會避免這種策略,因爲您可能會在其他時候使用它並意外刪除您不想要的文件。但是,如果你小心,它是有用的。 – jszakmeister

2

嘗試git update-index --assume-unchanged *.xcuserstate .DS_Store,看看它是否有助於

+0

這是做什麼用的? –

+0

Git不會將它們識別爲已更改,並且不會提示您提交它們。 – user376507

+0

問題是Xcode和OS X一直都在更改這些文件,所以Xcode認爲它需要不斷重新提交。 –