gitignore — скрыть игнорируемые файлы при оформлении заказа

Вот моя проблема (на примере шагов):

  • У меня есть репозиторий Git с двумя разными ветвями (ветвь A и ветвь B), которые в настоящее время идентичны.
  • Перейдите в ветку B и создайте новый файл "foo.txt".
  • Добавьте этот файл в «.gitignore» этой ветки, чтобы он успешно игнорировался в ветке B.
  • Создайте еще один файл «hello.txt», подготовьте его и зафиксируйте.
  • Оформить заказ в отделение А.
  • foo.txt появляется в ветке A, а hello.txt — нет.

Почему foo.txt появляется в ветке A, а не «скрывается», как это делает hello.txt?

С моей точки зрения, это сильно раздражает и похоже на запрос об ошибке/функции, но был ли Git разработан таким образом? Я был удивлен, обнаружив, что другие люди не жалуются на это.


person freshquiz    schedule 07.12.2012    source источник


Ответы (3)


Это не ошибка. Чтобы понять, как это работает, нужно знать несколько вещей.

  • .gitignore не применяется глобально "автоматически". Вы должны совершить это.
  • Любые незафиксированные файлы будут видны в каждой ветке. При переключении веток вы должны либо commit файл, либо stash его.

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

person Masked Man    schedule 07.12.2012
comment
У меня было ощущение, что это не ошибка, и я сожалею, что не нашел ее раньше. Вы видите, как это может раздражать? У меня есть файлы, которые я не хочу коммитить (потому что они специфичны для ОС), но я не хочу, чтобы они были во всех моих ветках. Я никогда раньше не использовал тайник, но из того, что сказал мне друг, это не похоже на идеальное решение, кажется немного хакерским, но я ценю ваш совет (все равно попробую). - person freshquiz; 07.12.2012
comment
Прочитав ответ из сообщения, на которое вы ссылаетесь, вы можете видеть, что Кристофер, похоже, думает о том же, что и я, о тайниках. Я считаю, что это заслуживает названия запроса функции для Git. Я пытаюсь придумать причины, по которым вы бы не хотели, чтобы проигнорированные файлы исчезали/появлялись снова при оформлении заказа, и я не могу ни о чем думать. - person freshquiz; 07.12.2012
comment
@freshquiz Я знаю, что это может немного раздражать. Вы не должны использовать stash, вы всегда можете использовать commit. Имейте в виду, что ваш commit обновляет только ваш локальный клон, и вы всегда можете отменить свою фиксацию, когда вернетесь в ветку позже. Кроме того, не беспокойтесь о том, что не найдете предыдущий вопрос. Поиск не всегда работает идеально. :) - person Masked Man; 07.12.2012
comment
Верно, но мне не нравится идея фиксации файлов, которые являются бинарными/специфичными для ОС и, следовательно, их следует игнорировать. Отмена коммитов вызывает у меня головную боль, и я не могу позволить себе так дешево потерять свою работу. Вам не кажется, что это был бы хороший запрос функции? - person freshquiz; 07.12.2012
comment
Я, конечно, был бы не против иметь эту функцию, и я также согласен с тем, что двоичные файлы и т. д. не должны быть зафиксированы (даже локально). Вы можете добавить их в .gitignore и посмотреть, поможет ли это. - person Masked Man; 07.12.2012
comment
Я мог бы просто представить это как запрос тогда. Я добавил их в свой файл(ы) .gitignore, но это не решает мою проблему. Когда я добавил их в свой .gitignore, я искренне ожидал, что моей проблемы не существует (т.е. функции, которая должна быть реализована), настолько мне это кажется логичным. - person freshquiz; 07.12.2012
comment
Да, пожалуйста, отправьте запрос. - person Masked Man; 07.12.2012
comment
Пока не нашел, где это сделать, но, чтобы сэкономить мне время, не могли бы вы представить, куда я мог бы пойти, чтобы это сделать? - person freshquiz; 07.12.2012

foo.txt не отображается в ветке A, он просто больше не игнорируется, потому что ваши изменения в .gitignore (я предполагаю, что вы зафиксировали их в ветке B) теряются, когда вы извлекаете ветку A. foo.txt — это просто неотслеживаемый файл. Если foo.txt «исчезает» при переключении на ветку A, это говорит о том, что вы хотите, чтобы файл был удален из вашего рабочего каталога. Это сильно отличается от игнорирования файла.

Вы можете указать шаблоны игнорирования, которые влияют на весь репозиторий, независимо от того, какую ветку вы извлекли, используя файл $GIT_DIR/info/exclude. Однако это локально для вашего репозитория, поэтому шаблоны игнорирования, указанные в этом файле, не будут распространяться на другие репозитории. См. gitignore(5).

person Chris    schedule 08.12.2012

Быстрый ответ:

  • hello.txt не «скрыт», он был зафиксирован в ветке B, и поэтому вы не увидите в ветке A, пока не объедините или не перебазируете ветку B в ветку A.
  • то же самое происходит с .gitignore. Если вы зафиксировали .gitignore в ветке B (что, я думаю, вы и сделали), а затем проверили ветку A, ну, ветвь A не имеет файла .gitignore, и поэтому вы видите foo.txt. Опять же, вам нужно объединить или перебазировать ветку B в ветку A.
person aalbagarcia    schedule 07.12.2012
comment
Я это уже знал, но все равно спасибо. Независимо от того, имеет ли ветка A тот же или другой файл .gitignore, моя точка зрения такова: я считаю, что файлы игнорирования должны исчезать/появляться снова во время проверки, как промежуточные файлы. - person freshquiz; 07.12.2012