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


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

я добавил *.csprojк моему МЕСТУ .gitignore, но файлы уже находятся в репо.

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

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

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


1415


источник


Ответы:


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

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

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

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

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

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

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

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


1779



Если вы это сделаете 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) будет полезен : разделите сборку на глобальные части и локальные переопределения.


220



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

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

    git rm --cached 
    

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

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


136



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

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

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

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

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

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

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

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


104



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

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

git rm -r --cached.

git add.

git commit -m "fixing .gitignore"

Найден ответ от Вот


77



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

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

git rm --cached -r .

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

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

Добавить

git add .

совершить

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

От себя

git push origin master

Вывод

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

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

37



To save some time the rules you add to your .gitignore can be used for removing multiple files/folders i.e.

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

or

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

e.t.c.


20



As pointed out in other answers, the selected answer is wrong.

The answer to another question suggests that it may be skip-worktree that would be required.

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

20



To prevent monitoring a file by git

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

And to revert it back use

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

3



Lots of people advice you to use git update-index --assume-unchanged. Indeed, this may be a good solution, but only in the short run.

What you probably want to do is this: git update-index --skip-worktree.

(The third option, which you probably don't want is: git rm --cached. It will keep your local file, but will be marked as removed from the remote repository.)

Difference between the first two options?

  • assume-unchanged is to temporary allow you to hide modifications from a file. If you want to hide modifications done to a file, modify the file, then checkout another branch, you'll have to use no-assume-unchanged then probably stash modifications done.
  • skip-worktree will follow you whatever the branch you checkout, with your modifications!

Use case of assume-unchanged

It assumes this file should not be modified, and gives you a cleaner output when doing git status. But when checking out to another branch, you need to reset the flag and commit or stash changes before so. If you pull with this option activated, you'll need to solve conflicts and git won't auto merge. It actually only hides modifications (git status won't show you the flagged files).

I like to use it when I only want to stop tracking changes for a while + commit a bunch of files (git commit -a) related to the same modification.

Use case of skip-worktree

You have a setup class containing parameters (eg. including passwords) that your friends have to change accordingly to their setup.

  • 1: Create a first version of this class, fill in fields you can fill and leave others empty/null.
  • 2: Commit and push it to the remote server.
  • 3: git update-index --skip-worktree MySetupClass.java
  • 4: Update your configuration class with your own parameters.
  • 5: Go back to work on another functionnality.

The modifications you do will follow you whatever the branch. Warning: if your friends also want to modify this class, they have to have the same setup, otherwise their modifications would be pushed to the remote repository. When pulling, the remote version of the file should overwrite yours.

PS: do one or the other, but not both as you'll have undesirable side-effects. If you want to try another flag, you should disable the latter first.


3



I am assuming that you are asking how to remove ALL the files in a specific folder or the bin folder, Rather than selecting each files separately.

You can use this command:

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

Make sure that you are in the parent directory of the of that directory.
This command will, recursively "delete" all the files which are in the bin/ or build/ folders. By the word delete I mean that git will pretend that those files are "deleted" and those files will not be tracked. The git really marks those files to be in delete mode.

Do make sure that you have your .gitignore ready for upcoming commits.
Documentation : git rm


0



The problem may be caused by the order of operation. If you modified the .gitignore first, then git rm --cached xxx,you may have to continue to encounter this problem.

Correct solution:

  1. git rm --cached xxx
  2. modified the .gitignore

Order invariant!

The .gitignore reload after modification!


0