Я клонировал проект, который включает в себя несколько .csproj
файлов. Мне не нужно / не нравится, чтобы мои локальные csproj
файлы отслеживались Git (или появлялись при создании патча), но они явно нужны в проекте.
Я добавил *.csproj
к своему МЕСТНОМУ .gitignore
, но файлы уже находятся в репо.
Когда я набираю git status, он показывает мои изменения, csproj
которые я не заинтересован в отслеживании или отправке патчей.
Как убрать «отслеживание» этих файлов из моего личного репозитория (но сохранить их в источнике, чтобы я мог их использовать), чтобы не видеть изменения при создании статуса (или создании патча)?
Есть ли правильный / канонический способ справиться с этой ситуацией?
.csproj
файле, который является очень важной частью любого проекта. Изменения в.csproj.user
файле или любых.Publish.XML
файлах, которые я полностью понимаю, не отслеживание, но я заинтригован тем, почему вы не хотите отслеживать.csproj
…Ответы:
Просто вызовите
git rm --cached
каждый из файлов, которые вы хотите удалить из контроля версий. Пока ваши локальные шаблоны игнорирования верны, вы не увидите эти файлы, включенные в вывод состояния git.Обратите внимание, что это решение удаляет файлы из репозитория, поэтому всем разработчикам необходимо поддерживать свои собственные локальные (не контролируемые редакцией) копии файла.
Чтобы git не обнаружил изменения в этих файлах, вы также должны использовать эту команду:
Что вы, вероятно, хотите сделать: (снизу @ Райан Тейлор ответ )
Полный ответ здесь в этом URL: http://source.kohlerville.com/2009/02/untrack-files-in-git/
источник
git ls-files | xargs git rm --cached
- это удалит все из индекса git в данном каталоге, не удаляя фактические файлы.git rm --cached -r <dir>
работает рекурсивно над папкой и всеми файлами в ней.Если вы это сделаете
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). разделите сборку на глобальные части и локальные переопределения.
источник
.csproj
?git ls-files -v
покажет файлы, которые предполагается неизменными, с помощью строчного индикатора (например,h
вместо обычногоH
для кэшированных файлов).Есть 3 варианта, вы, вероятно, хотите # 3
1. Это сохранит локальный файл для вас, но удалит его для всех остальных, когда они потянут.
git rm --cached <file-name>
илиgit rm -r --cached <folder-name>
2. Это для оптимизации, как папка с большим количеством файлов, например, SDK, которые, вероятно, никогда не изменятся. Он говорит git прекратить проверять эту огромную папку каждый раз на наличие изменений, локально, поскольку она не будет иметь никаких изменений.
assume-unchanged
Индекс будет обнулен и файл (ы) перезаписаны , если есть вверх по течению изменения в файле / папке (при вытягивании).3. Это говорит git, что вы хотите свою собственную независимую версию файла или папки. Например, вы не хотите перезаписывать (или удалять) производственные / промежуточные файлы конфигурации.
Важно знать, что
git update-index
не будет распространяться с помощью git, и каждому пользователю придется запускать его независимо.источник
grep
иgit ls-files
it gives me error that your local changes would be overwritten
извлекаю код из репозитория git origin в этих 2 файлах, это означает, что он не отслеживается, верно?Это двухэтапный процесс:
Удалить отслеживание файла / папки - но сохранить их на диске - используя
Теперь они не отображаются как «измененные», но все равно отображаются как
Добавьте их в
.gitignore
источник
Принятый ответ все еще не работал для меня
я использовал
Нашел ответ отсюда
источник
Забыли свой .gitignore?
Если у вас есть весь проект локально, но вы забыли добавить его, git ignore и теперь отслеживаете некоторые ненужные файлы, используйте эту команду, чтобы удалить все
убедитесь, что вы находитесь в корне проекта.
Тогда вы можете сделать обычное
Добавить
совершить
От себя
Вывод
Надеюсь, что это поможет людям, которые должны внести изменения в их
.gitignore
или забыли все это вместе.источник
Как указано в других ответах, выбранный ответ является неправильным.
Ответ на другой вопрос предполагает , что это может быть пропуск worktree , которые потребуются.
источник
--skip-worktree
используется для сохранения файла в хранилище, но для остановки отслеживания его изменений . Как говорится в вашем ответе: --skip-worktree полезен, когда вы указываете git не трогать определенный файл, потому что разработчики должны его изменить--assume-unchanged
и--skip-worktree
получите аналогичный эффект, но их цели совершенно другие. Первый предназначен для ускорения производительности git путем обмана git не проверять определенные файлы , а второй - для игнорирования будущих изменений в определенных файлах , которые подходят для времени выполнения, но важных файлов.Чтобы сэкономить время, вы можете использовать правила, которые вы добавляете в свой .gitignore, для удаления нескольких файлов / папок, т.е.
git rm --cached app/**/*.xml
или
git rm --cached -r app/widgets/yourfolder/
так далее
источник
Чтобы предотвратить мониторинг файла с помощью git
И чтобы вернуть его обратно используйте
Репозиторий для ссылок на похожие варианты использования https://github.com/awslabs/git-secrets
источник
Многие люди советуют вам использовать
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
У вас есть класс настройки, содержащий параметры (например, включая пароли), которые ваши друзья должны изменить в соответствии с их настройкой.
git update-index --skip-worktree MySetupClass.java
Изменения, которые вы делаете, будут следовать за вами независимо от ветки. Предупреждение: если ваши друзья также хотят изменить этот класс, они должны иметь ту же настройку, иначе их изменения будут перенесены в удаленный репозиторий. При вытягивании удаленная версия файла должна перезаписать вашу.
PS: делайте одно или другое, но не оба, так как у вас будут нежелательные побочные эффекты. Если вы хотите попробовать другой флаг, вы должны сначала отключить его.
источник
Чтобы запретить Git отслеживать изменения в вашем локальном файле / папке (т.е. git status не обнаружит изменения в нем), выполните:
И чтобы Git снова отслеживал изменения в вашей локальной версии (чтобы вы могли зафиксировать изменения), выполните:
источник
однострочный ответ
git update-index --assume-unchanged [path]
Используйте это всякий раз, когда у вас есть файл, который находится в центральном репо, а также в локальном репо. Вам необходимо внести изменения в этот файл, но его нельзя ставить / фиксировать в центральном репо. Этот файл не должен быть добавлен в
.gitignore
. поскольку новые изменения в файле, если они внесены системными администраторами, старшие разработчики должны быть распределены среди всех локальных репозиториев.Лучший пример: файл конфигурации для соединений с БД . В центральном репо у вас будут все имя пользователя, пароль, хост, порт со значениями рабочего сервера БД. Но в локальном dev вы должны использовать только локальный или любой другой сервер БД разработки (который есть у вашей команды). В этом случае вы хотите внести изменения в конфигурационный файл, но не должны быть зафиксированы в центральном репо.
Лучший
источник
Я предполагаю, что вы спрашиваете, как удалить ВСЕ файлы в определенной папке или папке bin, а не выбирать каждый файл отдельно.
Вы можете использовать эту команду:
git rm -r -f /<floder-name>\*
Убедитесь, что вы находитесь в родительском каталоге этого каталога.
Эта команда рекурсивно «удалит» все файлы, которые находятся в папках bin / или build /. Под словом «удалить» я подразумеваю, что git сделает вид, что эти файлы «удалены», и эти файлы не будут отслеживаться. Git действительно отмечает, что эти файлы находятся в режиме удаления.
Убедитесь, что ваш .gitignore готов к предстоящим коммитам.
Документация: git rm
источник
Проблема может быть вызвана порядком работы. Если вы сначала изменили .gitignore, а затем git rm --cached xxx, возможно, вам придется продолжать сталкиваться с этой проблемой.
Правильное решение :
Заказать инвариант!
.Gitignore перезагрузить после модификации!
источник
Я предполагаю, что вы пытаетесь удалить один файл из git tacking. для этого я бы порекомендовал ниже команду.
git update-index --assume-неизменный
Ex - git update-index --assume-неизмененный .gitignore .idea / compiler.xml
источник
Чтобы игнорировать любые изменения всех файлов (определенного типа) в каталоге, мне пришлось объединить некоторые из этих подходов, в противном случае файлы были созданы, если их ранее не существовало.
В приведенном ниже тексте «excirir» - это имя каталога, в который я не хочу смотреть изменения.
Сначала удалите все существующие новые файлы из кэша отслеживания изменений (без удаления из файловой системы).
Вы можете сделать то же самое с
modified:
.renamed:
немного сложнее, так как вам придется посмотреть->
бит сообщения для нового имени файла и выполнить предварительный->
бит, как описаноdeleted:
ниже.deleted:
файлы оказываются немного сложнее, так как вы не можете обновить индекс для файла, который не существует в локальной системеПоследняя команда в списке выше снова удалит файлы из вашей файловой системы, поэтому не стесняйтесь опускать это.
Затем заблокируйте отслеживание изменений из этого каталога
источник
В этом ответе был дан почти бесподобный подход без команд :
Чтобы игнорировать определенные файлы для каждого локального репо :
~/.gitignore_global
, например,touch ~/.gitignore_global
в вашем терминале.git config --global core.excludesfile ~/.gitignore_global
на этот раз.~/.gitignore_global
. напримерmodules/*.H
, которые будут считаться в рабочем каталоге, то есть$WORK_DIR/modules/*.H
.Чтобы игнорировать определенные файлы для одного локального репо :
.git/info/exclude
в репозитории, то есть запишите пути file / dir, в которые вы хотите игнорировать.git/info/exclude
. напримерmodules/*.C
, которые будут считаться в рабочем каталоге, то есть$WORK_DIR/modules/*.C
.источник
Применить .gitignore к настоящему / будущему
Если вам также необходимо удалить недавно проигнорированные файлы из истории коммитов ветви, или если вы не хотите, чтобы недавно игнорируемые файлы были удалены из будущих извлечений , посмотрите этот ответ .
источник
после долгого поиска найди способ сделать это. Псевдоним команда git в
.gitconfig
.like в проекте 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 && :
источник