gitignore не игнорирует папку

135

В корне моего проекта есть fooпапка. Внутри fooпапки у меня есть barпапка. Я хочу игнорировать все изменения всех файлов в моей barпапке. У меня это в моем gitignore:

/foo/bar

Папка проверяется: она существует и в ней есть файлы, которые нужно игнорировать. gitignoreэто commitТэд. Однако у меня есть файл, в котором я делаю изменения, и он находится внутри моей barпапки. Когда я печатаю

git status

внутри git bashя вижу файл, который следовало проигнорировать. В чем может быть причина и как я могу успешно игнорировать все файлы в моей папке бара?

Обратите внимание, что файлы ранее игнорировались с той же строкой, но мне пришлось временно удалить эту строку на commitчто-то на сервере. После этого commitя снова вставил строку в gitignore. Это было некоторое время назад, но теперь я заметил, что файлы будут в формате git status. Я ожидал, что смогу изменять игнорируемые файлы, не появляясь в git status.

Лайош Арпад
источник
В будущем вам не нужно изменять свои игнорирования, чтобы добавить что-то игнорируемое. git add -f ignored-fileдобавит файл, даже если он у вас игнорируется.
Chris
Что git status foo/bar/file-that-should-be-ignoredдает?
Chris
Файл, который следует игнорировать в случае каких-либо изменений. Мне явно чего-то не хватает, но, насколько мне известно, в этом случае список git status должен быть пустым при условии, что / foo / bar присутствует в .gitignore
Арпад
4
Похоже, этот файл на самом деле отслеживается Git. В какой-то момент он должен был быть добавлен в репозиторий. Вы можете увидеть его историю с помощью git log foo/bar/file-that-should-be-ignored. Если он не должен быть частью репозитория, вы должны удалить его, git rm --cached foo/bar/file-that-should-be-ignoredа затем зафиксировать, как предлагает Reck ниже (хотя я бы просто сделал это для файла, а не для всей папки). Это (а) удалит файл из Git, (б) сохранит файл в вашей локальной копии и (в) приведет к удалению файла, когда другие fetchили pullновая фиксация.
Крис

Ответы:

342

Я предполагаю, что эта папка уже была проверена в git?

Запускаем git rm -r --cached <folder>и проверяем еще раз.

иметь значение
источник
3
Это полностью удалит папку из репозитория (текущей версии). OP хочет, чтобы папка была там, но новые изменения не должны отслеживаться
Гарет
К сожалению, я должен удалить подтверждение. Это решение удаляло удаленные версии файлов при нажатии. Я хочу настроить gitignore, чтобы игнорировать все файлы в папке, а не удалять ее с удаленного компьютера. Это возможно? Я отменил решение.
Лайош Арпад
12
git update-index --assume-unchanged <folder>возможно?
Reck
3
@Lajos, разве ты не должен был просто исправить его ошибку вместо того, чтобы добавить туда этот запутанный комментарий «редактировать»?
cregox
2
@Cawas, поскольку этот сайт посвящен обмену знаниями, ответ: нет. Ошибочно принимать ответ, содержащий ошибку. Это -r не является необязательным.
Лайош Арпад,
47

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

  1. Зафиксируйте любые изменения, которые вам нужно исправить / изменить.
  2. Запустите эту команду: git rm -r --cached .(которая удаляет все из индекса git, чтобы обновить репозиторий git)
  3. Затем запустите эту команду: git add .(чтобы добавить все обратно в репо)
  4. Наконец, зафиксируйте эти изменения, используя git commit -m ".gitignore Fixed"

Вы можете найти ссылку на статью, в которой я нашел решение здесь .

sikanderBabwani
источник
1
Это не жизнеспособное решение, основанное на исходном вопросе. @ lagos-arpad специально спрашивал о подкаталоге, а не о проекте в целом. Ваше решение удаляет все из корневого уровня репозитория git, и это не рекомендуемый подход для решения этой проблемы.
Justinhartman 03
Даже если это всего лишь подкаталог, это решение сработало для меня, поскольку я имел дело только с одним файлом. Не могли бы вы объяснить, почему это не рекомендуется?
sikanderBabwani 05
1
То, с чем вы имели дело, не имеет значения. Это не ответ на вопрос и потенциально опасно, как указал другой ответ. Это удалит из удаленного репо то, что вам не нужно.
RichieHH
8

У меня возникла эта проблема, и я понял, что git на самом деле правильно игнорирует файлы / папки, но мой редактор кода (код Visual Studio) просто глючил и не «затенял их» должным образом на боковой панели пользовательского интерфейса. Я перезапустил VSCode, и они, как и ожидалось, стали серыми.

Марк Джексон
источник
То же самое здесь: VS Code v1.30.2 (пользователь)
xinthose
Мне то же. Большое спасибо за это решение! Мне было интересно, почему мой .gitignore не работает, пока я не попытался перезапустить VS Code. Я использую Visual Studio Code v1.44.2.
Фриц Лим,
6

В дополнение к принятому ответу

git rm -r --cached /foo/bar/
git status

Когда я это делаю, терминал показывает кучу rmфайлов в этом каталоге. Итак, чтобы предотвратить еще одну фиксацию, которая может излишне повлиять на удаленный доступ, я сделал:

git reset HEAD *
git status

После этого он ничего не сказал о фиксации, и когда я изменяю файлы внутри /foo/bar/и делаю это, git statusя все равно получаю nothing to commit.

learnsomemore
источник
1
Это просто возвращает меня туда, откуда я начал (проблема)
Шонуби Кореде,