Почему git игнорируется мой измененный файл?
Я произвольно изменяю файл в рабочем каталоге git.
git status
не распознает, что файл был изменен.
git add /path/to/file
не влияет.
git add -f /path/to/file
не влияет.
git status /path/to/file
показывает файл, как в ведре "изменения, подлежащие передаче".
Я удалил файл .gitignore, чтобы быть уверенным. Никакое изменение в любом из вышеуказанных действий.
Я сделал git reset --hard
, переделал мои изменения. Никакое изменение в любом из вышеуказанных действий.
Что здесь можно сделать?
Ответы
Ответ 1
Есть две общие причины, по которым Git игнорирует файл: gitignore
и submodules
.
Чтобы быть более конкретным, следующие условия вызовут Git игнорировать файл, когда вызывается "git add
":
- Файл соответствует шаблону в
$GIT_DIR/exclude
.
- Файл соответствует шаблону в файле
.gitignore
внутри репо.
- Файл соответствует шаблону в пользовательском файле
.gitignore
(указанном 'git config --global core.excludesfile
').
- Файл является частью подмодуля.
Более подробную информацию можно найти в другом вопросе SO:
Невозможно отслеживать файлы в подмодулях Git
Ответ 2
Также убедитесь, что вы не вручную обновили индекс, чтобы предположить, что измененный файл не изменился так:
git update-index --assume-unchanged path/to/file
Как ни глупо, как это звучит, я сделал это, а через несколько дней внес изменения в файл и не мог понять, почему git не отслеживал его. Я попробовал все вышеперечисленные предложения и продолжал вытягивать свои волосы. B/c измененный файл не был указан ни в каких файлах .gitignore
или exclude
.
Если вы сказали git предположить, что файл не изменился, вам придется:
git update-index --no-assume-unchanged path/to/file
или просто повторите клонирование репо, как я закончил, прежде чем я вспомнил, что я сделал...
Ответ 3
Оказывается, я добавил skip-worktree
в свой файл [1]
git update-index --skip-worktree path/to/file
и забыл. Вы можете отменить это с помощью:
git update-index --no-skip-worktree path/to/file
ls-files
с -v
обнаружил статус файла в моем случае:
git ls-files -v | grep path/to/file
S path/to/file
Буквы git ls-files -v
будут иметь префикс с и означают:
# H: cachead
# S: skip-worktree
# M: unmerged
# R: removed/deleted
# C: modified/changed
# K: to be killed
# ?: other
# lowercase letter: assume-unchanged
Чтобы определить вашу проблему
Не игнорируется ли файл git?
git check-ignore * **/* | grep path/to/file
git ls-files --exclude-standard --ignore
Если файл указан, в нем есть правило игнорирования. [2][3] Найдите его в одном из следующих файлов:
less .gitignore
less ~/.gitignore
less %USERPROFILE%\.gitignore # <- Probably the same file as the above one
less $( git config --global core.excludesfile )
less $( git config --system core.excludesfile )
less ${GIT_DIR:-.git}/exclude
Указывается ли файл assume-unchanged
git ls-files -v | grep path/to/file
Если файл имеет префикс строчной буквы, он помечен assume-unchanged
. Исправьте его:
git update-index --no-assume-unchanged path/to/file
Является ли файл помеченным skip-worktree
git ls-files -v | grep path/to/file
Если файл имеет префикс с S
, он помечен skip-worktree
. Исправьте его:
git update-index --no-skip-worktree path/to/file
Ответ 4
Проверить использование
$ git ls-files --exclude-standard --ignore
если файл действительно не исключен (есть другие файлы исключений, кроме .gitignore).
Ответ 5
Вы проверяете свой глобальный файл git ignore?
git config --global --get-all core.excludesfile
git config --system --get-all core.excludesfile
Если любой из них возвращает файл как свое значение, загляните в этот файл.
Ответ 6
если ваш файл находится в коврике "Изменения, подлежащие передаче", а затем git уже распознал изменение и собирается его зафиксировать! Его в индексе уже. В противном случае он будет находиться в корзине "Изменено, но не обновлено".
:)
Надеюсь, что это поможет/
Ответ 7
Вы уверены, что ваш файл не исключен некоторыми файлами .gitignore в родительских каталогах?
Ответ 8
После того, как вы выполнили git add, выполнили ли вы фиксацию, так что на самом деле в репо, и ее можно сравнить с (измененной) рабочей копией?
Ответ 9
Проверьте каждый родительский каталог из соответствующего файла на корневой каталог проекта для файлов .gitignore.
В некоторых проектах используются несколько файлов .gitignore, каждый в своем собственном каталоге, а не один .gitignore в корне.