Как остановить отслеживание и игнорировать изменения в файле в Git?
Я клонировал проект, который включает в себя некоторые .csproj
файлы. Мне не нужен / не нравится мой местный csproj
файлы отслеживаются Git (или вызываются при создании патча), но они явно необходимы в проекте.
я добавил *.csproj
на мой местный .gitignore
, но файлы уже находятся в репо.
Когда я набираю git status, он показывает мои изменения csproj
который я не заинтересован в отслеживании или представлении патчей.
Как убрать "отслеживание" этих файлов из моего личного репозитория (но сохранить их в источнике, чтобы я мог их использовать), чтобы не видеть изменения, когда я делаю статус (или создаю патч)?
Есть ли правильный / канонический способ справиться с этой ситуацией?
22 ответа
Просто звоню git rm --cached
на каждом из файлов, которые вы хотите удалить из контроля версий, должно быть в порядке. Пока ваши локальные шаблоны игнорирования верны, вы не увидите эти файлы, включенные в вывод состояния git.
Обратите внимание, что это решение удаляет файлы из репозитория, поэтому всем разработчикам потребуется поддерживать свои собственные локальные (не контролируемые ревизиями) копии файла.
Чтобы git не обнаружил изменения в этих файлах, вы также должны использовать эту команду:
git update-index --assume-unchanged [path]
Что вы, вероятно, хотите сделать: (снизу @ Райан Тейлор ответ)
- Это говорит git, что вы хотите свою собственную независимую версию файла или папки. Например, вы не хотите перезаписывать (или удалять) производственные / промежуточные файлы конфигурации.
git update-index --skip-worktree <path-name>
Полный ответ здесь в этом URL: http://source.kohlerville.com/2009/02/untrack-files-in-git/
Есть 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, и каждый пользователь должен будет запустить его независимо.
Если вы делаете 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). разделите сборку на глобальные части и локальные переопределения.
Это двухэтапный процесс:
Удалить отслеживание файла / папки - но сохранить их на диске - используя
git rm --cached
Теперь они не отображаются как "измененные", но все равно отображаются как
untracked files in git status -u
Добавьте их в
.gitignore
Принятый ответ все еще не работал для меня
я использовал
git rm -r - кэшировано.
мерзавец добавить.
git commit -m "исправление.gitignore"
Нашел ответ отсюда
Забыли свой.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
- Добавляет файлы, которые вы хотите отслеживать
- Подталкивает к вашему репо
Чтобы предотвратить мониторинг файла с помощью git
git update-index --assume-unchanged [file-path]
И чтобы вернуть его обратно используйте
git update-index --no-assume-unchanged [file-path]
Как указано в других ответах, выбранный ответ является неправильным.
Ответ на другой вопрос предполагает, что это может быть скип-дерево, которое потребуется.
git update-index --skip-worktree <file>
Чтобы сэкономить время, вы можете использовать правила, которые вы добавляете в свой.gitignore, для удаления нескольких файлов / папок, т.е.
git rm --cached app/**/*.xml
или же
git rm --cached -r app/widgets/yourfolder/
так далее
Многие люди советуют вам использовать 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: делайте одно или другое, но не оба, так как у вас будут нежелательные побочные эффекты. Если вы хотите попробовать другой флаг, вы должны сначала отключить его.
Чтобы запретить Git отслеживать изменения в вашем локальном файле / папке (т.е. git status не обнаружит изменения в нем), выполните:
git update-index --skip-worktree path/to/file
И чтобы Git снова отслеживал изменения в вашей локальной версии (чтобы вы могли зафиксировать изменения), выполните:
git update-index --no-skip-worktree path/to/file
Применить.gitignore к настоящему / будущему
Этот метод применяет стандартное поведение.gitignore и не требует вручную указывать файлы, которые необходимо игнорировать.
Не могу использовать
--exclude-from=.gitignore
больше:/ - Вот обновленный метод:Общий совет: начните с чистого репо - все зафиксировано, ничего не ожидает в рабочем каталоге или индексе, и сделайте резервную копию!
#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
Если вам также нужно очистить недавно проигнорированные файлы из истории фиксации ветки или если вы не хотите, чтобы недавно проигнорированные файлы удалялись из будущих извлечений, см. Этот ответ.
Однострочный ответgit update-index --assume-unchanged [path]
Используйте это всякий раз, когда у вас есть файл, который находится в центральном репо, а также в локальном репо. Вам нужно внести изменения в этот файл, но не должны быть поставлены / зафиксированы в центральном репо. Этот файл не следует добавлять в.gitignore
. поскольку новые изменения в файле вносятся системными администраторами, старших разработчиков необходимо распределить между всеми локальными репозиториями.
Лучший пример: файл конфигурации для подключений к БД. В центральном репо у вас будут все имя пользователя, пароль, хост, порт со значениями рабочего сервера БД. Но в локальном разработчике вы должны использовать только локальный или любой другой сервер БД разработки (который настроен вашей командой). В этом случае вы хотите внести изменения в файл конфигурации, но не должны фиксироваться в центральном репо.
Лучший
git rm --fileName
git ls-files
чтобы убедиться, что файл удален или не отслеживается
git commit -m "UntrackChanges"
git push
Я предполагаю, что вы спрашиваете, как удалить ВСЕ файлы в определенной папке или папке bin, а не выбирать каждый файл отдельно.
Вы можете использовать эту команду:git rm -r -f /<floder-name>\*
Убедитесь, что вы находитесь в родительском каталоге этого каталога.
Эта команда рекурсивно "удалит" все файлы, которые находятся в папках bin / или build /. Под словом "удалить" я подразумеваю, что git будет делать вид, что эти файлы "удалены" и эти файлы не будут отслеживаться. Git действительно отмечает эти файлы как находящиеся в режиме удаления.
Убедитесь, что ваш.gitignore готов к предстоящим коммитам.
Документация: git rm
Я предполагаю, что вы пытаетесь удалить один файл из git tacking. для этого я бы порекомендовал ниже команду.
git update-index --assume-неизменный
Ex - git update-index --assume-неизмененный.gitignore .idea/compiler.xml
Чтобы игнорировать любые изменения всех файлов (определенного типа) в каталоге, мне пришлось объединить некоторые из этих подходов, в противном случае файлы были созданы, если их ранее не существовало.
В приведенном ниже слове "excirir" - это имя каталога, в который я не хочу смотреть изменения.
Сначала удалите все существующие новые файлы из кэша отслеживания изменений (без удаления из файловой системы).
git status | grep "new file:" | cut --complement -d " " -f1-4 | grep "^excludedir" | xargs git rm --cache
Вы можете сделать то же самое с modified:
, renamed:
немного сложнее, так как вам придется посмотреть на пост ->
бит для нового имени файла, и сделать пред ->
немного, как описано для 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/
Вы можете игнорировать неотслеживаемые файлы или каталог, используя файл. Вы можете определить некоторые файлы в этом файле конфигурации, и Git перестанет отслеживать этот файл или каталог.
Примечание: это работает только локально.
Так открыто.git/info/exclude
в текстовом редакторе и начните его редактировать. См. ниже:
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
my_dir/my_file.txt
В этом ответе был дан почти бесподобный подход без команд:
Чтобы игнорировать определенные файлы для каждого локального репо:
- Создать файл
~/.gitignore_global
например,touch ~/.gitignore_global
в вашем терминале. - Бежать
git config --global core.excludesfile ~/.gitignore_global
однажды. - Запишите пути к файлам / каталогам, которые вы хотите игнорировать
~/.gitignore_global
, напримерmodules/*.H
, который будет находиться в вашем рабочем каталоге, т.е.$WORK_DIR/modules/*.H
,
Чтобы игнорировать определенные файлы для одного локального репо:
- Сделайте вышеуказанный третий шаг для файла
.git/info/exclude
в репо, то есть записать пути к файлам / каталогам, которые вы хотите игнорировать.git/info/exclude
, напримерmodules/*.C
, который будет находиться в вашем рабочем каталоге, т.е.$WORK_DIR/modules/*.C
,
Вышеуказанные решения сgit rm --cached
,git update-index --assume-unchanged
и т. д. у меня почему-то не сработало.
Что сработало, так это добавление файла в .gitignore :
Project/Test.file
затем добавьте файл «шаблона» с помощью опции --force:
$ git add Project/Test.file -f
который добавил шаблон в репозиторий и больше не отслеживает его изменения.
После долгого поиска найди способ сделать это. псевдоним команды 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 && :
Проблема может быть вызвана порядком работы. Если вы сначала изменили.gitignore, а затем git rm --cached xxx, возможно, вам придется продолжать сталкиваться с этой проблемой.
Правильное решение :
- мерзавец - кэшированный ххх
- изменил.gitignore
Заказать инвариант!
.Gitignore перезагрузить после модификации!