Как остановить отслеживание и игнорировать изменения в файле в Git?

я клонировал проект, который включает в себя несколько .csproj файлы. Мне не нужно / как мой местный csproj файлы отслеживаются Git (или выводятся при создании патча), но, очевидно, они необходимы в проекте.

я добавил *.csproj внешний вид .gitignore, но файлы уже находятся в репозитории.

когда я набираю статус git, он показывает мои изменения в csproj который я не заинтересован в отслеживании или отправке патчей.

как я удалите "отслеживание" этих файлов из моего личного РЕПО (но держите их в источнике, чтобы я мог их использовать), чтобы я не видел изменений, когда я делаю статус (или создаю патч)?

есть ли правильный/канонический способ справиться с этой ситуацией?

15 ответов


звоню git rm --cached на каждом из файлов, которые вы хотите удалить из контроля версий, должно быть хорошо. Пока ваши локальные шаблоны игнорирования верны, вы не увидите эти файлы, включенные в вывод статуса git.

обратите внимание, что это решение удаляет файлы из репозитория, поэтому всем разработчикам необходимо будет поддерживать свои собственные локальные (не контролируемые ревизией) копии файла

чтобы предотвратить git от обнаружения изменений в этих файлах, вы также должны использовать эта команда:

git update-index --assume-unchanged [path]

что вы, вероятно, хотите сделать: (снизу @Ryan Taylor answer)

  1. это сказать git, что вы хотите свою собственную независимую версию файла или папки. Например, вы не хотите перезаписывать (или удалять) производственные / промежуточные файлы конфигурации.

git update-index --skip-worktree <path-name>

полный ответ здесь, в этом URL: http://source.kohlerville.com/2009/02/untrack-files-in-git/


Если у вас git update-index --assume-unchanged file.csproj, git не будет проверять файл.csproj для изменений автоматически: это остановит их появление в состоянии git при каждом их изменении. Так что можешь пометить все свои .файлы csproj таким образом-хотя вам придется вручную пометить любые новые, которые вышестоящий РЕПО отправляет вам. (Если они у вас есть в вашем .gitignore или .git/info/exclude, тогда те, которые вы создаете, будут проигнорированы)

Я не совсем уверен, что .файлы csproj есть... если они что-то вроде конфигураций IDE (аналогично Eclipse .затмение и. classpath files), то я бы предложил, чтобы они просто никогда не контролировались источником вообще. С другой стороны, если они являются частью системы сборки (например, Makefiles), то, очевидно, они должны--- и способ забрать дополнительные локальные изменения (например, из локального.csproj файл а-ля конфиг."МК") будет полезным: разделить, создать в глобальной частей и локальные переопределения.


это двухэтапный процесс:

  1. удалить отслеживание файла / папки-но сохранить их на диске-с помощью

    git rm --cached 
    

    Теперь они не отображаются как "измененные", но все еще показывают как

        untracked files in  git status -u  
    
  2. добавлять их в .gitignore


есть 3 варианта, вы, вероятно, хотите #3

1. это сохранит локальный файл для вас, но удалит его для кого-либо еще, когда они вытащат.

git rm --cached <file-name> или git rm -r --cached <folder-name>

2. это для оптимизации, как папка с большим количеством файлов, например SDKs, которые, вероятно, никогда не изменится. Он говорит git прекратить проверять эту огромную папку каждый раз для изменений локально, так как у нее не будет никаких изменений. Этот assume-unchanged индекс будет сброшен и файл(ы) перезаписан, если есть изменения вверх по течению в файл/папку (когда вы тянете).

git update-index --assume-unchanged <path-name>

3. это сказать git, что вы хотите свою собственную независимую версию файла или папки. Например, вы не хотите перезаписывать (или удалять) производственные/промежуточные файлы конфигурации.

git update-index --skip-worktree <path-name>

важно знать, что git update-index не распространяется С git, и каждый пользователь должен будет запустить его независимо.


принятый ответ все еще не работал для меня

Я

git rm-r --кэшируется .

git добавить .

фиксация git commit-m".gitignore"

нашел ответ от здесь


забыли .гитюдного?

если у вас есть весь проект локально, но забыли добавить вас git игнорировать и теперь отслеживают некоторые ненужные файлы используйте эту команду, чтобы удалить все

git rm --cached -r .

убедитесь, что вы находитесь в корневом каталоге проекта.

тогда вы можете сделать обычный

добавить

git add .

фиксация

git commit -m 'removed all and added with git ignore'

пуш

git push origin master

вывод

надеюсь, это поможет людям кто должен внести изменения в их .gitignore или забыл все это вместе.

  • он удаляет весь кэш
  • смотрит на свой .gitignore
  • добавить файлы, которые вы хотите отслеживать
  • толкает к вашему РЕПО

чтобы сэкономить время, правила, которые вы добавить в свой .gitignore может использоваться для удаления нескольких файлов / папок, т. е.

git rm --cached app/**/*.xml

или

git rm --cached -r app/widgets/yourfolder/

e.т. c.


как указано в других ответах, выбранный ответ неверен.

на ответ на другой вопрос предполагает, что это может быть skip-worktree, который потребуется.

git update-index --skip-worktree <file>

многие люди советуют вам использовать git update-index --assume-unchanged. Действительно, это может быть хорошим решением, но только в краткосрочной перспективе.

что вы, вероятно, хотите сделать это: git update-index --skip-worktree.

(третий вариант, который вы, вероятно, не хотите:git rm --cached. Он сохранит ваш локальный файл, но будет помечен как удаленный из удаленного репозитория.)

разница между первыми двумя вариантами?

  • assume-unchanged временно разрешить вы, чтобы скрыть изменения из файла. Если вы хотите скрыть изменения, сделанные в файле, изменить файл, а затем проверить другую ветку, вам придется использовать no-assume-unchanged тогда, вероятно, изменения тайника сделаны.
  • skip-worktree будет следовать за вами независимо от того, какую ветку вы проверяете, с вашими изменениями!

пример использования assume-unchanged

предполагается, что этот файл не должен быть изменен, и дает вам более чистый вывод при выполнении git status. Но когда отправляясь в другую ветку, вам нужно сбросить флаг и зафиксировать или заначить изменения до этого. Если вы вытащите эту опцию, вам нужно будет решить конфликты, и git не будет автоматически сливаться. На самом деле он скрывает только модификации (git status не покажет вам помеченные файлы).

мне нравится использовать его, когда я хочу только остановить отслеживание изменений на некоторое время + зафиксировать кучу файлов (git commit -a), связанных с то же самое модификации.

случае использования skip-worktree

у вас есть класс установки, содержащий параметры (например. включая пароли), которые ваши друзья должны изменить в соответствии с их настройкой.

  • 1: Создайте первую версию этого класса, заполните поля, которые вы можете заполнить, и оставьте другие пустыми/null.
  • 2: зафиксируйте и нажмите его на удаленный сервер.
  • 3: git update-index --skip-worktree MySetupClass.java
  • 4: обновите класс конфигурации с помощью собственных параметров.
  • 5: вернуться работать над другой функциональностью.

изменения, которые вы делаете, будут следовать за вами независимо от ветви. Внимание: если ваши друзья также хотят изменить этот класс, они должны иметь ту же настройку, иначе их изменения будут перенесены в удаленный репозиторий. При вытягивании удаленная версия файла должна перезаписать вашу.

PS: сделайте то или другое, но не оба, так как у вас будут нежелательные побочные эффекты. Если вы хотите попробовать другой флаг, сначала вы должны отключить последнее.


чтобы предотвратить мониторинг файла с помощью git

git update-index --assume-unchanged [file-path]

и вернуть его обратно использовать

git update-index --no-assume-unchanged [file-path]

чтобы сказать Git не отслеживать изменения в локальном файле / папке (то есть git status не будет обнаруживать изменения в нем), сделайте:

git update-index --skip-worktree path/to/file

и чтобы сказать Git отслеживать изменения в вашей локальной версии еще раз (чтобы вы могли зафиксировать изменения), сделайте:

git update-index --no-skip-worktree path/to/file

Я предполагаю, что вы спрашиваете Как удалить все файлы в определенной папке или папке bin, а не выбор каждого файла отдельно.

вы можете использовать эту команду:

git rm -r -f /<floder-name>\*

Убедитесь, что вы находитесь в Родительском каталоге этого каталога.
Эта команда будет рекурсивно "удалять" все файлы, которые находятся в папке bin/ или build/. Под словом delete я подразумеваю, что git будет притворяться, что эти файлы "удаляются", и эти файлы не будут отслеживаться. Git действительно отмечает эти файлы в режиме удаления.

убедитесь, что у вас есть .гитюдного готовы к предстоящим изменениям.
документация : git rm


проблема может быть вызвана порядком работы. Если вы изменили .сначала gitignore, затем git rm --cached xxx, возможно, вам придется продолжать сталкиваться с этой проблемой.

правильное решение:

  1. git rm --кэшированный xxx
  2. изменен .gitignore

порядок инвариант!

The .gitignore перезагрузить после модификации!


Я предполагаю, что вы пытаетесь удалить один файл из Git оверштаг. для этого я бы порекомендовал следующую команду.

git update-index --assume-unchanged

Ex-git update-index --предположим-без изменений .гитюдного .идея / компилятор.в XML


чтобы игнорировать любые изменения во всех файлах (определенного типа) в каталоге, мне пришлось объединить некоторые из этих подходов, иначе файлы были созданы, если они ранее не существовали.

ниже "excludedir" - это имя каталога, в который я не хочу смотреть изменения.

во-первых, удалите все существующие новые файлы из кэша отслеживания изменений (без удаления из файловой системы).

git status | grep "new file:" | cut  --complement -d " " -f1-4 | grep "^excludedir" | xargs git rm --cache

вы можете сделать то же самое с modified:. renamed: немного сложнее, так как вам придется посмотреть на сообщение -> бит для нового имени файла и сделайте pre -> бит, как описано для deleted: ниже.

deleted: файлы оказываются немного сложнее, так как вы не можете обновить-индекс для файла, который не существует в локальной системе

echo .deletedfiles >> .gitignore
git status | grep "deleted:" | cut  --complement -d " " -f1-4 | grep "^excludedir" > .deletedfiles
cat .deletedfiles | xargs -d '\n' touch
cat .deletedfiles | xargs -d '\n' git add -f
cat .deletedfiles | xargs -d '\n' git update-index --assume-unchanged
cat .deletedfiles | xargs -d '\n' rm

последняя команда в списке выше снова удалит файлы из вашей файловой системы, поэтому не стесняйтесь опускать это.

затем измените блок отслеживание из этого каталога

git ls-files excludedir/ | xargs git update-index --skip-worktree
git update index --skip-worktree excludedir/