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

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

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

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

Есть 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, и каждому пользователю придется запускать его независимо.

Ответ 4

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

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

    git rm --cached 
    

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

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

Ответ 5

Принятый ответ по-прежнему не работает для меня

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

git rm -r --cached.

git добавить.

git commit -m "fixing .gitignore"

Найден ответ от здесь

Ответ 6

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

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

git rm --cached -r .

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

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

Добавить

git add .

Зафиксировать

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

Нажмите

git push origin master

Заключение

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

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

Ответ 7

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

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

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

Ответ 8

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

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

или

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

e.t.c.

Ответ 9

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

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

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

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

Репозиторий для ссылок на похожие варианты использования https://github.com/awslabs/git-secrets

Ответ 10

Многие люди советуют вам использовать 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: делайте одно или другое, но не оба, так как у вас будут нежелательные побочные эффекты. Если вы хотите попробовать другой флаг, вы должны сначала отключить его.

Ответ 11

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

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

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

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

Ответ 12

однострочный ответ git update-index --assume-unchanged [path]

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

Лучший пример: файл конфигурации для соединений с БД. В центральном репо у вас будут все имя пользователя, пароль, хост, порт со значениями рабочего сервера БД. Но в локальном dev вы должны использовать только локальный или любой другой сервер БД разработки (который есть у вашей команды). В этом случае вы хотите внести изменения в конфигурационный файл, но не должны быть привязаны к центральному репо.

Лучший

Ответ 13

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

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

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

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

Убедитесь, что ваш .gitignore готов к предстоящим фиксациям.
Документация: git rm

Ответ 14

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

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

  • git rm --cached xxx
  • изменен .gitignore

Инвариант заказа!

Перезагрузите .gitignore после изменения!

Ответ 15

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

git update-index -assume-неизменный

Ex - git update-index --assume-unchanged .gitignore.idea/compiler.xml

Ответ 16

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

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

Сначала удалите все существующие новые файлы из кэша отслеживания изменений (без удаления из файловой системы).

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

Вы можете сделать то же самое с modified:. renamed: немного сложнее, так как вам нужно посмотреть бит post -> для нового имени файла и выполнить бит 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/

Ответ 17

В этом ответе был дан почти подход без команды:

Чтобы игнорировать определенные файлы для каждого локального репо:

  1. Создайте файл ~/.gitignore_global, например, touch ~/.gitignore_global в вашем терминале.
  2. Запустите git config --global core.excludesfile ~/.gitignore_global один раз.
  3. Запишите пути к файлам/директориям, которые вы хотите игнорировать, в ~/.gitignore_global. например modules/*.H, который предположительно будет находиться в вашем рабочем каталоге, т.е. $WORK_DIR/modules/*.H.

Чтобы игнорировать определенные файлы для одного локального репо:

  1. Выполните описанный выше третий шаг для файла .git/info/exclude в репозитории, то есть запишите пути к файлам/каталогам, которые вы хотите игнорировать, в .git/info/exclude. например modules/*.C, который, как предполагается, будет находиться в вашем рабочем каталоге, то есть $WORK_DIR/modules/*.C.

Ответ 18

Применить .gitignore к настоящему/будущему

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

Can't use --exclude-from=.gitignore anymore : / - Here the updated method:

Общий совет: начните с чистого репо - все зафиксировано, ничего не ожидает в рабочем каталоге или индексе, и сделайте резервную копию!

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

Если вам также необходимо удалить недавно проигнорированные файлы из истории фиксации ветки или если вы не хотите, чтобы недавно проигнорированные файлы были удалены из будущих операций, см. этот ответ.

Ответ 19

после долгого поиска найди способ сделать это. Псевдоним команда git в .gitconfig. Как и в проекте Android Studio , перед веткой оформления заказа верните файл конфигурации, а затем пропустите его , После того, как ветка оформления заказа используйте sed, измените файл конфигурации на мою локальную конфигурацию. checkoutandmodifylocalproperties = !git update-index --no-skip-worktree local.properties && git checkout local.properties && git checkout $1 && git update-index --skip-worktree local.properties && sed -i '' 's/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g' local.properties && :