Git: использование .gitignore с разными ветвями

#git #gitignore #git-branch

#git #gitignore #git-branch

Вопрос:

У меня довольно простая рабочая среда, но мне не удается работать с Git так, как хотелось бы.

Вот как мы можем это описать: две ветви A и B с двумя файлами каждая в своих рабочих деревьях, первый файл — toMerge, а второй — toKeepSpecific.

У меня один и тот же .gitignore в двух ветвях, говорящий игнорировать файл, специфичный для tokeep. Файл, специфичный для toKeepSpecific, никогда не передавался, поэтому в удаленном репозитории две ветви содержат только toMerge.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я нахожусь в ветке B и пытаюсь выполнить проверку ветки A, у меня появляется следующее сообщение: «Следующий неотслеживаемый файл рабочего дерева будет перезаписан при проверке». Я думал, что .gitignore позаботится об этом, но, видимо, нет…

Какая среда git наиболее подходит для такого рода нужд?

Спасибо!

Комментарии:

1. На какой неотслеживаемый файл он жалуется? Кроме того, .gitignore не должен управлять файлами, которые отслеживает git.

2. Что ж, жалоба возникает из-за файла, специфичного для toKeepSpecific…

Ответ №1:

git ignore сообщает git не отслеживать содержимое файлов по определенным именам.

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

IOW: игнорирование git не влияет на существующие версии. Отслеживаемые файлы продолжают отслеживаться, пока вы их не удалите


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

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

Если вы используете рабочий процесс git, который не позволяет вам использовать --force параметры, тогда я предлагаю вам использовать git clean -x команду для очистки неотслеживаемых (т. Е. игнорируемых) файлов перед переключением ветвей

Комментарии:

1. Я не хочу использовать —force, потому что я не хочу, чтобы файл перезаписывался, я хочу сохранить текущую локальную версию…

2. проверка выполняет проверку. Вы не можете проверить версию, сохранив некоторые файлы неизмененными. Сначала вам нужно убедиться, что блокирующие файлы больше не находятся в версии, которую вы пытаетесь проверить. Вы можете попробовать поступить наоборот: git checkout revision -- notignored1/ notignored2/ но это изменит семантику: это не приведет к обновлению HEAD до версии checkout, а скорее перезапишет именованные локальные файлы, оставаясь в том же HEAD, что и раньше.

3. Добавлено уточнение к ответу

4. Спасибо! Но дело в том, что блокирующие файлы ОТСУТСТВУЮТ в версии, которую я пытаюсь проверить. По сути, я просто хочу проверить все файлы, кроме тех, которые не только игнорируются, но и не находятся ни в одной ветке (файлы присутствуют только локально в рабочем дереве). Но я вижу идею сделать наоборот… Я просто надеюсь, что есть более естественное решение…

5. "The following untracked working tree file would be overwritten by checkout" противоречит вашему утверждению, что эти файлы находятся не в той редакции, которую вы пытаетесь проверить. Я бы лично дважды проверил это (например git ls-tree -r "branchA:path/to/ignored.file" )