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

1306

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

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

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

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

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

  • 15
    Очень полезный вопрос, но мне любопытно, почему вы не хотите отслеживать изменения в файле .csproj , который является очень важной частью любого проекта. Изменения в файле .csproj.user или любых .Publish.XML файлах .Publish.XML которые я полностью понимаю, не отслеживая, но я заинтригован тем, почему вы не хотите отслеживать .csproj
  • 6
    Может они используют другую IDE?
Показать ещё 4 комментария
Теги:

12 ответов

1670
Лучший ответ

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

  • 5
    Согласно инструкции: git-rm - удаление файлов из рабочего дерева и из индекса. Это именно то, чего я не хочу делать. Я что-то пропустил? Однако, глядя на документацию по git rm, я вижу --cached --cached: используйте эту опцию, чтобы удалять и удалять пути только из индекса. Файлы рабочего дерева, модифицированные или нет, будут оставлены в покое. Я думаю, это то, что мне нужно, верно?
  • 166
    «git rm --cached <file>» удалит <file> из контроля версий, сохранив его в рабочем хранилище. Будь то, что вы хотите ...
Показать ещё 22 комментария
212

Если вы выполняете 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
    Как вы отмените это?
  • 46
    git update-index --no-assume-unchanged file.csproj
Показать ещё 14 комментариев
130

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

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

    git rm --cached 
    

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

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

  • 51
    Нет, это удалит файл из отслеживания, сохранит его локально, но приведет к тому, что он будет удален для всех, кто тянет .
  • 1
    В моем случае я случайно добавил папку, которую не хотел отслеживать, так что это то, что мне нужно.
Показать ещё 1 комментарий
69

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

  • 3
    Этот ответ является наиболее полным - он предлагает различные решения с разветвлениями каждого. В конкретном случае, с которым я работаю, пароль встроен в файл конфигурации. Я хочу распространить файл шаблона, а затем добавить пароль к моей копии. Копия с паролем должна игнорироваться и не перезаписываться.
  • 0
    Как я могу проверить, в моем локальном компьютере, какие файлы применяются для «предположить, без изменений» или «skip-worktree»?
Показать ещё 2 комментария
67

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

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

git rm -r --cached.

git добавить.

git commit -m "fixing .gitignore"

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

  • 0
    Эта ссылка очень полезна, особенно для рекурсивного удаления всех файлов в .gitignore
  • 7
    Я возвращался сюда 3 раза, надеюсь, я смогу сохранить память до следующего раза!
32

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

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

git rm --cached -r .

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

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

Добавить

git add .

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

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

Нажмите

git push origin master

Заключение

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

  • Удаляет весь кеш
  • Посмотрим на ваш .gitignore
  • Добавляет файлы, которые вы хотите отслеживать
  • Отбрасывает ваше репо
  • 4
    Когда вы говорите об удалении или добавлении, вы забываете сказать, когда и где. Удаление из списка треков? Из хранилища? Из локального проектного пространства? Удаление на тягу? На коммит? На толчок? Увы, у всех авторов здесь одна и та же проблема.
  • 3
    @Gangnus Я не думаю, что кто-то "прояснил" мысль, которую вы пытаетесь сделать, потому что совершенно очевидно, что файл на самом деле не удаляется с диска или из хранилища. Этот ответ указывает хронологический порядок команд. Это не таинственно или плохо объяснено, поскольку Ваш комментарий предположил бы.
21

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

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

или

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

e.t.c.

  • 0
    Это очень хорошее решение, потому что в любом случае вы хотите починить gitignore шаг за шагом.
19

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

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

git update-index --skip-worktree <file>
  • 2
    Нет, не совсем: --skip-worktree используется для сохранения файла в хранилище, но не для отслеживания его изменений . Как говорится в вашем ответе: --skip-worktree полезен, когда вы указываете git не трогать определенный файл, потому что разработчики должны изменить его
  • 4
    @ErdalG. Именно так. В соответствии с вопросом, они хотят игнорировать любые изменения в файле, но сохранить файл в репо
Показать ещё 1 комментарий
2

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

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

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

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

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

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

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

0

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

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

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

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

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

0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню