2014-02-19 3 views
16

В Xcode я заметил, что .DS_Store и * .xcuserstate всегда меняются и не нуждаются в совершении. Итак, я написал файл .gitignore, который содержит это:Удаление файлов .xcuserstate и DS_Store из git

.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

Вам, вероятно, придется обернуть это в кавычки, чтобы оболочка не расширила его и не позволила git сделать эту честь. Плюс, я вообще избегаю такой тактики, потому что у вас может возникнуть соблазн использовать ее в другое время и случайно удалить файлы, которые вы не намеревались. Но если вы осторожны, это полезно. – jszakmeister

2

Попробуйте git update-index --assume-unchanged *.xcuserstate .DS_Store и посмотреть, если это помогает

+0

Что это делает? –

+0

Git не будет распознавать их как измененные, и он не будет предлагать вам их совершить. – user376507

+0

Проблема заключается в том, что Xcode и OS X постоянно изменяют эти файлы, поэтому Xcode считает, что он постоянно нуждается в повторной передаче. –

Смежные вопросы