Gitignore не работает

276

Мой .gitignoreфайл по какой-то причине не работает, и никакое количество Google не смогло это исправить. Вот что у меня есть:

*.apk
*.ap_
*.dex
*.class
**/bin/
**/gen/
.gradle/
build/
local.properties
**/proguard/
*.log

Он находится в каталоге master, который является моим git-репо. Я использую Git 1.8.4.2, потому что у меня MacBook под управлением OSX 10.8.6.

user3280133
источник
4
1. какие файлы проиндексированы, хотя они не должны? 2. Вы добавили .gitignore после того, как добавили эти файлы в репозиторий?
Ахмад
2
@ Ахмад В нескольких проектах /bin/папка все еще показывает, когда я делаю git status. Я не менял эти файлы с тех пор, как добавил.gitignore
user3280133
1
«так как я добавил .gitignore» - так вы добавили .gitignore после добавления файлов?
Ахмад
3
возможный дубликат .gitignore не работает
Лиам

Ответы:

688

Файлы / папка в вашем контроле версий не будут просто удаляться только потому, что вы добавили их в .gitignore. Они уже находятся в хранилище, и вы должны удалить их. Вы можете просто сделать это с этим:

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

git rm -rf --cached .
git add .

Это удалит все файлы из хранилища и добавит их обратно (на этот раз с соблюдением правил в вашем .gitignore).

Ahmad
источник
2
или вы можете просто попытаться вернуть файлы / папки, которые вы добавили в .gitignore, с помощью git checkout folder_to_ignore / *
Захра
1
@ Greenish, но это не сработало бы, если они уже были зафиксированы, сработало бы, только если они были размещены, что в случае, если папка уже была в .gitignore, не должно произойти (если вы не принудительно добавите) :)
Ахмад
1
не работает для меня, когда я помещаю изменения в github. Говорит все актуально !!!!
Доктор Юнес Хенни
1
Извините, Ахмед, я исправил свою проблему, удалив файл gitignore, вытащил и снова нажал на удаленное хранилище. Я больше не помню, что он сказал, когда набираю git status. Моя проблема исправлена. Большое спасибо.
Доктор Юнес Хенни
3
Я думаю, что лучше git добавить команду 'git ignore', чтобы упростить это. Таким образом, мы могли бы просто использовать git ignore path/fileв любое время.
Ее
123

Чтобы отследить отдельный файл, который уже был добавлен / инициализирован в вашем хранилище, то есть прекратить отслеживание файла, но не удалять его из вашей системы: git rm --cached filename

Чтобы отследить каждый файл, который сейчас находится в вашем .gitignore:

Сначала подтвердите все ожидающие изменения кода, а затем выполните эту команду:

git rm -r --cached .

Это удалит все измененные файлы из индекса (промежуточной области), а затем просто запустите:

git add .

Передайте это:

git commit -m ".gitignore is now working"
никола
источник
1
Не забудьте объединить ваши ветви обратно в master или переместить указатель, потому что, когда я попробовал это, я потерял обе свои функциональные ветви. К счастью, я не потерял ни одной работы, все мои последние обновления из рабочей ветки были сброшены в основную ветку, но в зависимости от ваших настроек такое поведение может быть нежелательным.
Санки
Как бы вы использовали эту команду для удаления папки из кэша вместо файла?
RealMJDev
15

Пройдя немного по кроличьей норе, пытаясь проследить ответы на этот вопрос (возможно, потому, что мне пришлось сделать это в визуальном студийном проекте), я обнаружил, что более простой путь к

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

  2. Зафиксируйте «удаление» этих файлов

  3. Зафиксируйте изменение, .gitignoreчтобы исключить файлы, которые я временно переместил

  4. Переместите файлы обратно в папку.

Я обнаружил, что это самый простой способ сделать это (по крайней мере, в визуальной студии, или я бы предположил, что в другой среде, основанной на IDE), например, в Android Studio), без случайного попадания в ногу с довольно распространенным эффектом git rm -rf --cached ., после чего Визуальный студийный проект, над которым я работал, не загружался.

Гаррет Симпсон
источник
2
Мне очень нравится этот подход - кажется менее разрушительным, даже если он не считается "правильным".
17
6

В моем случае это было пустое место в начале файла, которое было ясно видно при открытии файла в блокноте, не было очевидно в коде Visual Studio.

С Саад
источник
4

Я использовал что-то, чтобы создать общее .gitignoreдля меня, и я столкнулся с этим. Прочитав ответ @Ozesh, я открыл в VS Code, потому что в правом нижнем углу у него есть хороший индикатор, показывающий тип окончаний строк. Это был LF, поэтому я перешел в CRLF, как и предлагалось, но без кубиков.

Затем я посмотрел рядом с окончаниями строки и заметил, что она была сохранена с использованием UTF16. Поэтому я восстановил с помощью UTF8 кодирования вуаля, это сработало. Я не думал, что CRLF имеет значение, поэтому я изменил его обратно на LF, чтобы убедиться, и он все еще работал.

Конечно, это не было проблемой OP, так как он уже зафиксировал файлы, поэтому они уже были проиндексированы, но подумал, что я поделюсь, если кто-то еще наткнется на это.

TLDR ; Если вы еще не зафиксировали файлы, и .gitignore по-прежнему не соблюдается, проверьте кодировку файлов и убедитесь, что это UTF8, а если это не работает, то, возможно, попробуйте поиграть с окончаниями строк.

DeezCashews
источник
1
UTF16 был виновником для меня. Открыл код VS> открыл .gitignore> открыл командную строку> «Изменить кодировку файла»> «UTF-8»> Сохранить файл
Майкл
3

В моем случае причиной были пробельные символы в конце строки .gitignore. Так что следите за пробелами в .gitignore!

026
источник
2

Я решил свою проблему следующим образом:

Прежде всего, я пользователь Windows, но я столкнулся с аналогичной проблемой. Итак, я публикую свое решение здесь.

Есть одна простая причина, почему иногда .gitignore не работает так, как должно. Это связано с поведением преобразования EOL.

Вот быстрое решение для этого

Правка> Преобразование EOL> Формат Windows> Сохранить

Вы можете винить в этом настройки вашего текстового редактора .

Например:

Поскольку я являюсь разработчиком Windows, я обычно использую Notepad ++ для редактирования своего текста, в отличие от пользователей Vim.

Итак, что происходит, когда я открываю свой файл .gitignore с помощью Notepad ++, он выглядит примерно так:

## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore


# See https://help.github.com/ignore-files/ for more about ignoring files.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
*.dll
*.force
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

Если я открою тот же файл с помощью Блокнота по умолчанию, это то, что я получу

## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## ## Get latest from  https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # See https://help.github.com/ignore-files/ for more about ignoring files. # User-specific files *.suo *.user *.userosscache 

Таким образом, вы, возможно, уже догадались, посмотрев на результат. Все в .gitignore стало однострочным, и так как в начале есть ##, он действует так, как будто все прокомментировано.

Способ исправить это прост: просто откройте файл .gitignore с помощью Notepad ++, а затем выполните следующие действия.

Правка> Преобразование EOL> Формат Windows> Сохранить

В следующий раз, когда вы откроете тот же файл в блокноте по умолчанию, все должно быть правильно отформатировано. Попробуйте и посмотрите, работает ли это для вас.

Ozesh
источник
1

Кроме того, комментарии должны быть на своей линии. Их нельзя ставить после входа. Так что это не сработает:

/node_modules  # DON'T COMMENT HERE (since nullifies entire line)

Но это будет работать:

# fine to comment here
/node_modules
Бен Притчард
источник
0

У git reset --hardкого-нибудь работает? Я не говорю, что это хорошее решение, мне показалось, что оно сработало с первого раза.

user1889992
источник
Пожалуйста, игнорируйте мой комментарий выше. Кто-то на работе сделал что-то не так в Git, это вызвало дублирование папок, и я не знал об этом в течение долгого времени. Спасибо.
user1889992
0

Я сделал большую ошибку, отредактировав свой dockerignore, сработал отлично после того, как я нашел правильный файл игнорирования: p


источник
0

Добавление моего бита, поскольку это популярный вопрос.

Я не мог поместить каталог .history в .gitignore, потому что независимо от того, какую комбинацию я пробовал, она просто не работала. Windows продолжает генерировать новые файлы при каждом сохранении, и я не хочу их видеть вообще.

введите описание изображения здесь

Но потом я понял, что это всего лишь моя личная среда разработки на моей машине. Такие вещи, как .history или .vscode, специфичны для меня, поэтому было бы странно, если бы каждый включал свои собственные записи .gitignore в зависимости от того, какую IDE или ОС они используют.

Так что это сработало для меня, просто добавьте ".history" в .git / info / exclude

echo ".history" >> .git/info/exclude
Даниэль Кац
источник