.gitignore ігнорується Git


1510

.gitignoreМожливо, мій файл ігнорується Git - чи може .gitignoreфайл бути пошкодженим? Який формат файлу, локаль чи культуру очікує Git?

Мій .gitignore:

# This is a comment
debug.log
nbproject/

Вихід від git status:

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       debug.log
#       nbproject/
nothing added to commit but untracked files present (use "git add" to track)

Мені б хотілося debug.logі nbproject/не з’являтися у списку незатребуваних файлів.

З чого я повинен почати шукати, щоб це виправити?


56
Переконайтесь, що ваш .gitignoreфайл використовує ANSIабо UTF-8кодує. Якщо він використовує щось подібне Unicode BOM, можливо, Git не може прочитати файл.
ADTC

8
@ADTC це була саме проблема моєї машини (Windows). Я використовував echo "file" > .gitignoreу PowerShell, файл мав кодування UCS-2!
MarioDS

7
git rm --cached debug.log nbproject/
Гаян Веракутті

4
Чому перший коментар тут - не відповідь, це поза мною
RedOrav

2
@MattParkins Ага, я бачу це зараз, і досі мене дивує, що така проста і чітка відповідь похована як коментар або що фактично прийнятий - там. Дякую!
RedOrav

Відповіді:


3117

Навіть якщо ви ще не відслідковували файли, Git, здається, зможе "знати" про них навіть після того, як ви їх додасте .gitignore.

УВАГА: Спочатку введіть свої поточні зміни, інакше ви їх втратите.

Потім запустіть такі команди з верхньої папки вашого сховища Git:

git rm -r --cached .
git add .
git commit -m "fixed untracked files"

8
Я отримав "використання: git rm [параметри] [-] <файл> ...", надрукований, коли я спробував "git rm -r --cached". Якщо це має значення, я використовую Git з PowerShell після натискання "Інструменти-> Відкрити оболонку тут" у GitHub для Windows.
Soonts

61
в Windows: git rm. -r - кеш і додавання git.
Beachhouse

90
Будьте в курсі здійснити всі ваші зміни раніше, інакше ви втратите контроль над усіма зміненими файлами !!
Космін

45
Перші 3 коментатори, здається, пропустили крапку в підсумку. Це означає кожен файл. "git -rm -r - кешований." <- помітити крапку.
Крістоф Де Троєр

18
Якщо ви не хочете взяти на себе зобов’язання, вирішенням цього питання є розміщення змін на полиці: "git stash". Виконайте вищевказані команди. і запустіть "git stash pop"
Іван Ворошилін

335

Якщо вам здається, що Git не помічає змін, які ви внесли у свій .gitignoreфайл, ви можете перевірити наступні моменти:

  • Можливо, існує глобальний .gitignoreфайл, який може перешкоджати локальному
  • Додавши щось у файл .gitignore, спробуйте це:

    git add [uncommitted changes you want to keep] && git commit
    git rm -r --cached .
    git add .
    git commit -m "fixed untracked files"
    
  • Якщо ви вилучите щось із файлу .gitignore, а вищезазначені кроки, можливо, не спрацьовують, якщо ви виявили, що описані вище кроки не працюють, спробуйте :

    git add -f [files you want to track again]
    git commit -m "Refresh removing files from .gitignore file."
    
    // For example, if you want the .java type file to be tracked again,
    // The command should be:
    //     git add -f *.java
    

3
Можливо, ви могли б відредагувати відповідь @AlinHuruba, щоб додати свій крок 3?
Бендж

@Benj Дякую за пораду, я не знайшов відповіді Алінхуруби, не знаю, у чому різниця, тому, будь ласка, скажіть мені прямо.
ifeegoo

2
Крок 3 - це те, що мені було потрібно. Більшість відповідей просто розповідає, як видалити файл, який ми хочемо зняти. Дякую за протилежну точку зору.
Єун

Сподіваюся, це допоможе вам!
ifeegoo

7
git rm -r --cached .працював на мене
Джейсон

198

Виправлено. Гаразд, я створив .gitignore файл у Блокноті в Windows, і він не працював. Коли я переглянув файл .gitignore в Linux, це виглядало як організований хитрець - можливо, Блокнот виписав Unicode, а не ASCII або що б там не було 8-бітним.

Тож я переписав файл на своєму вікні Linux, і коли я повернув його назад у Windows, він працює чудово! Ура!


77
У Блокноті просто виберіть кодування "ANSI" у діалоговому вікні "Зберегти як". Або ще краще, придбайте належний текстовий редактор - адже ви програміст :) ... Я можу порекомендувати "Блокнот програміста", інші вважають за краще "Блокнот програміста" ++, а там буквально сотні.
0xC0000022L

1
Хе-хе, так, я мав би створити це в netbeans (якими я користувався в той час), затемнення або візуальній студії. Я щойно назвав це з командного рядка, думаючи, що це не має значення.
Метт Паркінс

8
Моя проблема була схожа - мій .gitignore використовував UTF8 з BOM . Просто зберегли його як UTF8 без BOM, і він чарівно почав працювати.
Філ

13
Це була і моя проблема. Я створив файл .gitignore з "echo dirName> .gitignore", оскільки Windows викликає такий біль, щоб створювати файли, що починаються з ".". Кодування файлу, створеного таким чином, було нечитабельним git, і він інтерпретував його як двійковий файл. Натиснувши "Кодування -> UTF-8" у Блокноті ++, збережіть, зробили.
Лаура

4
Була така ж проблема, як @Laura в powershell - файл за замовчуванням зберігається як UTF16.
mrówa

113

Без додавання чергової комісії до вашого проекту, одного рядка буде достатньо, щоб зробити .gitignoreроботу так, як належить:

git rm -r --cached debug.log nbproject

Це видалить їх із сховища, але все одно збереже їх фізично. Простий англійською мовою він видаляє будь-яку історію змін, пов’язаних з ними, а також не відстежує їх зміни в будь-якому майбутньому зобов'язанні. Ви можете знайти найкраще пояснення тут .


1
Працював саме так, як я хотів - у мене був лише 1 файл, який не відстежувався належним чином. Я зберегла його вміст у блокноті, і зробила: git rm -r --cached someFile.phpі це спрацювало як шарм :)
ShayLivyatan

@FMFF Це видалить його з сховища, але все-таки збереже їх фізично, звичайною англійською мовою, він видалить будь-яку історію змін, пов’язаних з ними, а також не відстежить їх зміни в будь-якому майбутньому здійсненні. Краще експлікації ви можете знайти тут: stackoverflow.com/questions/37279654 / ...
H Aßdøμ

Я отримав "fatal: pathspec 'debug.log' не відповідав жодним файлам"
Майкл

45

Ще одна причина цієї проблеми - порожні пробіли або вкладки перед випискою:

Приклад:

# Be aware of the following:
 notWorkingIgnore.*
workingIgnore.*

І як зазначається в коментарі нижче, пробіл може бути проблемою також:

# Be aware of the following:
notWorkingIgnore.* #<-Space
workingIgnore.*#<-Nospace

11
Моя проблема була моїм простір, який ще складніше знайти.
amr

3
також була проблема з пробілом у пробілі.
Trefex

3
Так, тут те саме. Я думав , що я міг би написати коментарі після шаблону файлу: *.txt # Tex files. Але git розуміє: "Ігноруйте файли з розширенням txt "
Адам Лібуша

3
Моє слово, мені знадобилося 2 дні, щоб знайти цю відповідь на 15. Це заслуговує на більше.
fordcars

2
Ви щойно вирішили проблему, яку я мала місяцями ... Дякую!
Аркелліс

36

Я помітив, що кодування .gitignoreфайлу дало ефект - якщо файл Unicode, його ігнорували, якщо це ASCII, це не було.

Процес:

  1. Підтвердити статус: PS> git status
  2. Створіть функцію Get-FileEncoding
  3. .gitignoreКодування тесту :PS> Get-FileEncoding .gitignore
  4. Змініть кодування на ASCII:PS> Set-Content .gitignore -Encoding Ascii -Value (Get-Content .gitignore)
  5. Підтвердити: PS> git status

5
1000 подяк за це. Я створював .gitignore файл у своїй системі за допомогою touch .gitignoreта echo ".db" >> .gitignoreмаршруту через powershell. Я виявив, що echo ".db" >> .gitignore"параметр кодування файлу встановлював на UCS-2 LE-BOM, швидке перетворення в ASCII і gitignore почав працювати.
B-Rad

2
Можна спробувати, пропустивши крок 2 і 3.
Анікет Бхансалі

32

Як і з іншими рішеннями, зробити перший і бути в курсі , що ви будете втрачати НЕ-прихильний зміни.

Я мав кращі результати з цього:

git rm -r --cached .
git reset HEAD --hard
git status

Зауважте, що зараз статус не повинен мати жодних змінених файлів.


2
це один не працює для мене , але ifeegoo у відповідь робить
Фанні

21

У моєму випадку це тому, що файли вже є у сховищі, і я намагаюся його ігнорувати.

Ось що я зробив, щоб виправити проблему:

  • Скопіюйте файли у тимчасову папку
  • Видаліть їх із моєї папки проекту.
  • Введіть зміни, які видаляють ці файли з сховища
  • Повторно додав ці файли до моєї папки проекту

На той час будь-які зміни, внесені до цих файлів, були ігноровані

Я думаю, ви не можете ігнорувати файли, які вже є у сховищі.


У моєму випадку вони вже були поставлені. Тільки зробивши те, що ви пропонуєте, потім спробу скоїти та побачивши попередження про те, що вони були поставлені та зняті, я зрозумів, що це проблема.
dudeNumber4

19

Усі відповіді тут насправді обхідні. Перед запуском потрібно створити .gitignore файл git init. Інакше gitніколи не дізнається, що вам потрібно ігнорувати ці файли, оскільки вони вже відстежуються.

echo .idea/ >> .gitignore
git init

Якщо ви розвиваєтеся щодня, я раджу вам додавати у ваш ~/.gitignore_globalфайл звичні ігноровані файли . Таким чином, gitви вже будете знати, які файли ви (тобто "ваш користувач", оскільки це файл у вашому домашньому каталозі) зазвичай ігнорують.


Слава Богу ... нарешті рішення, яке працює для мене.
двомісне

~/.gitignore_global- це ім'я, яке можна настроїти. Запустіть git config --global core.excludesfileспочатку, щоб побачити, чи вже у вас визначений файл. Якщо ні, бігайте git config --global core.excludesfile ~/.gitignore_global.
Номенон

Вирішення проблеми, якщо ви не створили .gitignoreспочатку: перейменуйте відстежений файл. .gitignoreбуде застосовано так, ніби це було новим.
Номенон

15

Також перегляньте каталог, куди ви поставили.gitignore .

Це має бути в корені вашого проекту :

./myproject/.gitignore

Не в

./myproject/.git/.gitignore

9

Спеціально для користувачів Windows: Якщо у вас відслідковуються файли та очищення / видалення кешованих файлів не працює. Спробуйте відкрити PowerShell і перетворити файл .gitignore в кодування UTF-8:

$Myfile = Get-Content .\.gitignore`
$Myfile | Out-File -Encoding "UTF8" .gitignore

Вам потрібно зробити це лише один раз, щоб кодувати файл .gitignore для цього каталогу, а оскільки файл кодується правильно, кожного разу, коли ви редагуєте файл у майбутньому, він повинен працювати. Я вважаю, що це пов'язано з проблемою, коли GitHub не збирається читати кодування UTF-8 для файлу .gitignore. Наскільки мені відомо, ця проблема ще не вирішена для Windows. Це не надто велика угода, просто біль налагодити, коли це не працює.


8

З .gitignoreцим може виникнути ще одна проблема , особливо для користувача Windows. Git не подобається, коли ви називаєте .gitignore(наприклад, unity.gitignore).

Ви завжди хочете назвати його .gitignoreабо в Windows, .gitignore.як Windows вважає, що ви намагаєтесь перейменувати його без імені файлу.


7

Я щойно стикався з цим питанням. Вміст у моєму файлі .gitignore продовжував відображатися у списку незатребуваних файлів.

Я використовував це для створення файлу ігнорування:

echo "node_modules" > .gitignore

Виявляється, подвійні цитати викликали проблему для мене. Я видалив файл ігнорування, а потім знову використав команду без лапок, і вона спрацювала як очікувалося. Мені не потрібно було возитися з кодуванням файлів. Я на машині Windows 10 за допомогою Cmder .

Приклад:

echo node_modules > .gitignore

Дивно, цей виголошений вислів виправив проблему, яка в мене була локально, коли ігнорований файл, який я видалив випадково, а потім відтворив, відображався як прихильний файл, який не відслідковується. Чомусь, хоча це не змінило мій файл ігнорування, воно виправило мою проблему.
Патрік

6

Для мене жодна з попередніх відповідей не спрацювала. Мені довелося скопіювати .gitignoreтекст у exclude.txtфайл, знайдений у

<Your-project-folder>\.git\info

Після завершення оновіть зміни, і всі незатребувані файли вже не будуть. Зробіть як завжди.


6

Моя проблема була (як запропонував ОП) пошкоджений файл .gitignore. Я не вірив, що це було, і ігнорував можливість, поки все інше не вдалося. Корупція не з'являвся вvi , але були два байта на початок файлу, що викликав файл .gitignore ігноруватися. Для мене вони з’явилися лише тоді, коли я вводив текст cat .gitignore, який показував:

��# Built application files
*.apk
*.ap_

# ...

Я поняття не маю, як вони закінчилися там, але відтворення файлу вирішило проблему. Шестнадцятковий аналіз пошкодженого файлу показав наступне:

user@dev ~/project/myproject $ xxd -b .gitignore
00000000: 11111111 11111110 00100011 00000000 00100000 00000000  ..#. .
00000006: 01000010 00000000 01110101 00000000 01101001 00000000  B.u.i.

2
Це схоже на позначку порядку байт UTF-16 у файлі, кодованому UTF-8. en.wikipedia.org/wiki/Byte_order_mark
jsageryd

6

У мене виникла проблема з файлом .gitignore, що містить цей рядок:

lib/ext/

Я щойно зрозумів, що насправді цей каталог є символічним посиланням на іншу папку:

ls -la lib/ext/
lrwxr-xr-x 1 roipoussiere users 47 Feb  6 14:16 lib/ext -> /home/roipoussiere/real/path/to/the/lib

У рядку lib/ext/Git насправді шукає папку , але символічне посилання - це файл , тому моя libпапка не ігнорується.

Я це виправив, замінивши lib/ext/на lib/extв моєму файлі .gitignore.


5

У мене була ця сама проблема. Я вважаю, що проблема полягала в розбіжності CR проти CR + LF. Я приховав речі у своєму .gitignore за допомогою CMD (у Windows 7) та наступної команди:

Погано:

echo "file_to_be_ignored.py" >> .gitignore<br>
echo "*~" >> .gitignore

І т.д.

Проблема полягала в тому, що ця команда не розміщує правильний маркер кінця рядка для того, щоб Git розпізнавав нові рядки (або CR, або CR + LF, коли Git очікує іншого). Я вирішив проблему, вручну замінивши кожен новий рядок у Vim (Vim на допомогу!), І він працював ідеально.

Спробуйте відредагувати .gitignore в Блокноті ++ або Vim (в ідеалі). Навіть якщо файл виглядає як він відформатований правильно, спробуйте замінити нові рядки. Це звучить дивно, я знаю, але це працювало на мене. : D



3

Слід також звернути увагу: чи зберігаєте ви .gitignore файл із правильними закінченнями рядків?

Windows:

Якщо ви використовуєте його в Windows, чи зберігаєте ви його з кінцями рядків Windows? Не всі програми будуть робити це за замовчуванням; Блокнот ++ та багато редакторів PHP за замовчуванням закінчуються рядками Linux, тому файли будуть сумісні з сервером. Один з простих способів перевірити це - це відкрити файл у Блокноті Windows. Якщо все з’являється в одному рядку, то файл було збережено із закінченнями рядка Linux.

Linux:

Якщо у вас виникають проблеми з тим, як файл працює в середовищі Linux, відкрийте його в такому редакторі, як Emacs або nano . Якщо ви бачите будь-які символи, які не можна роздрукувати, файл збережено із закінченнями рядка Windows.


3

Ще одна можлива причина - кілька примірників клієнтів Git, які працюють одночасно . Наприклад, "git shell" + "GitHub Desktop" тощо.


Це сталося зі мною. Я використовував "GitHub Desktop" в якості основного клієнта, і він ігнорував деякі нові налаштування .gitignore: commit після фіксації:

  1. Ви щось вчиняєте.
  2. Далі, зробіть фіксацію: вона ігнорує налаштування .gitignore. Комісія включає багато тимчасових файлів, згаданих у .gitignore.
  3. Clear Git кеш; перевірити, чи є .gitignore UTF-8; видалення файлів → фіксація → переміщення файлів назад; пропустити одну фіксацію - нічого не допомогло.

Причина : редактор коду Visual Studio працював у фоновому режимі з тим же відкритим сховищем. Код Visual Studio має вбудований контроль Git, і це спричиняє деякі конфлікти.

Рішення : двічі перевірте кілька прихованих клієнтів Git та використовуйте одночасно лише один клієнт Git, особливо очищаючи кеш Git.


3

Є вже кілька чудових відповідей, але моя ситуація була нудною. Я відредагував джерело встановленого програмного забезпечення для управління PLM (управління життєвим циклом продукту) на Win10 і згодом вирішив: "Я, мабуть, мав би зробити це git repo".

Отже, варіант кешу не буде працювати для мене безпосередньо. Публікація для інших, хто, можливо, додав контроль джерела ПІСЛЯ виконувати купу початкової роботи І .gitignoreНЕ працює, АЛЕ, можливо, ви будете боятися втратити купу роботи, томуgit rm --cached це не для вас.

ВАЖЛИВО: Це дійсно тому, що я занадто пізно додав git до "проекту", який занадто великий і, здається, ігнорує мою .gitignore. Я ніколи не погоджуюся. Я можу зітхнути з цим :)

По-перше, я щойно зробив:

rm -rf .git
rm -rf .gitignore

Тоді мені довелося уявити свої зміни. Знову ж таки, це інсталяційний продукт, на якому я робив зміни. Занадто пізно для першого вчинення чистої галузі. Отже, мені потрібен був список того, що я змінив після встановлення програми, додавши > changed.logдо будь-якого з наступного:

PowerShell

# Get files modified since date.
Get-ChildItem -Path path\to\installed\software\ -Recurse -File | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-02-25')} | Select-Object FullName

Баш

# Get files modified in the last 10 days...
find ./ -type f -mtime -10

Тепер у мене є свій список того, що я змінив за останні десять днів (давайте не вживатимемо тут кращих практик, крім того, щоб сказати, так, я це зробив сам).

По-новому, зараз:

git init .
# Create and edit .gitignore

Мені довелося порівняти мінливий список зі своїм зростаючим .gitignore, запущеним git status .

Нарешті, я список бажаних змін! У моєму випадку це котяча панель - деяка тема працює разом із конфігураціями sever xml, характерними для роботи системи розробників проти цього програмного забезпечення, яке я хочу поставити в репо для інших розробників, щоб захопити та внести свій внесок у ... Це буде наша головна галузь, тому вчинення, штовхання, і, нарешті, БРАНЮВАННЯ для нової роботи!


2

Просто видаліть папку або файл, який було зроблено раніше в Git, за допомогою наступної команди. Тоді файл gitignore відображатиме правильні файли.

    git rm -r -f "folder or files insides"

2

Одна хитра річ, на яку не поширюються інші відповіді, - це те, що .gitignore файл не працюватиме, якщо у вас є вбудовані коментарі, як це:

foo/bar # The bar file contains sensitive data so we don't want to make this public

Отже, якщо у вас є такі коментарі, змініть їх так:

# The bar file contains sensitive data so we don't want to make this public
foo/bar

2

Також є можливість редагувати .gitignoreфайл sudoкомандою. Я зіткнувся з тією ж проблемою і під час виконання команд:git status я все ще міг побачити файли "слід ігнорувати".

При редагуванні з nano .gitignoreзамість sudo nano .gitignore, я міг бачити правильне відображення.


2

Я створив .gitignore, використовуючи echo "..." > .gitignoreв PowerShell в Windows, тому що це не дозволяє мені створювати його в Windows Explorer.

Проблемою в моєму випадку було кодування створеного файлу, і проблема була вирішена після того, як я змінив його на ANSI.


2

У мене теж є те саме питання на Ubuntu, я створив .gitignoreтермінал, і він працює для мене

touch .gitignore


2

Шахта не працювала, тому що я дослівно створив текстовий документ під назвою .gitignore

Натомість створіть текстовий документ, відкрийте його в Блокноті ++ та збережіть як .gitignore

Обов’язково виберіть Усі типи (*. *) Зі спадного меню, коли ви зберігаєте його.


Або в gitbash, просто використовуйте touch .gitignore


1

Якщо ви Notepad ++ користувач , спробуйте виконати наступне:

Відкрийте свій .gitignore файл за допомогою Notepad ++ і виконайте:

Редагування меню → Перетворення EOLФормат WindowsЗберегти .

Спробуйте використовувати git status ще раз і подивіться, чи працює він для вас.

Я відправив відповідь на подібне питання тут .


1

Для мене це була ще одна проблема. Мій файл .gitignore створений для того, щоб ігнорувати все, крім речей, які я йому не дозволяю ігнорувати. Ось такі:

/*
!/content/

Тепер це очевидно означає, що я також кажу Git ігнорувати сам файл .gitignore. Що не було проблемою, доки я не відстежував файл .gitignore. Але в якийсь момент я вчинив сам файл .gitignore. Потім це призвело до правильного ігнорування файлу .gitignore.

Отже, додавши ще один рядок, це виправлено:

/*
!/content/
!.gitignore

1

Моя проблема полягала в тому, що я записав файли, щоб ігнорувати цитатами "" розділення не з косою рисою /.

Це не спрацювало, і git було проігноровано:

"db.sqlite3"
"tdd_venv/"

Це спрацювало чудово:

/db.sqlite3
/tdd_venv/

Я також перевірив кодування свого файлу у Windows за допомогою Notepad ++. Кодування було встановлено на UTF-8.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.