Как остановить отслеживание и игнорировать изменения в файле в Git? - PullRequest
1573 голосов
/ 01 июня 2009

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

Я добавил *.csproj в свой ЛОКАЛЬНЫЙ .gitignore, но файлы уже находятся в репо.

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

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

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

Ответы [ 17 ]

1957 голосов
/ 01 июня 2009

Просто вызовите 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/

237 голосов
/ 01 июня 2009

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

Я не совсем уверен, что такое файлы .csproj ... если они что-то похожи на конфигурацию IDE (аналогично файлам Eclipse .eclipse и .classpath), то я бы предложил, чтобы они просто никогда не были исходными контролируется на всех. С другой стороны, если они являются частью системы сборки (например, Makefiles), то, очевидно, они должны --- и был бы полезен способ получения необязательных локальных изменений (например, из local.csproj a la config.mk). : разделите сборку на глобальные части и локальные переопределения.

171 голосов
/ 27 октября 2016

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

1. Это сохранит локальный файл для вас, но удалит его для всех остальных, когда они извлекут.

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

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

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

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

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

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

145 голосов
/ 02 августа 2011

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

  1. Удалить отслеживание файла / папки - но сохранить их на диске - используя

    git rm --cached 
    

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

    .
        untracked files in  git status -u  
    
  2. Добавьте их к .gitignore

89 голосов
/ 18 сентября 2014

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

Я использовал

git rm -r --cached.

git add.

git commit -m "fixing .gitignore"

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

43 голосов
/ 04 ноября 2015

Забыли свой .gitignore?

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

git rm --cached -r .

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

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

Добавить

git add .

Commit

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

Нажмите

git push origin master

Заключение

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

  • Удаляет весь кеш
  • смотрит на ваш .gitignore
  • Добавляет файлы, которые вы хотите отслеживать
  • подталкивает к вашему репо
23 голосов
/ 12 мая 2015

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

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

git update-index --skip-worktree <file>
21 голосов
/ 07 ноября 2013

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

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

или

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

e.t.c.

9 голосов
/ 20 февраля 2018

Многие люди советуют вам использовать 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: создайте первую версию этого класса, заполните поля, которые вы можете заполнить, и оставьте другие поля пустыми / пустыми.
  • 2: зафиксируйте и отправьте его на удаленный сервер.
  • 3: git update-index --skip-worktree MySetupClass.java
  • 4: Обновите ваш класс конфигурации с вашими собственными параметрами.
  • 5: вернуться к работе над другой функцией.

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

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

6 голосов
/ 13 июня 2018

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

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

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

git update-index --no-skip-worktree path/to/file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...