Подтвердить что ты не робот

Почему git игнорируется мой измененный файл?

Я произвольно изменяю файл в рабочем каталоге git.

git status не распознает, что файл был изменен.

git add /path/to/file не влияет.

git add -f /path/to/file не влияет.

git status /path/to/file показывает файл, как в ведре "изменения, подлежащие передаче".

Я удалил файл .gitignore, чтобы быть уверенным. Никакое изменение в любом из вышеуказанных действий.

Я сделал git reset --hard, переделал мои изменения. Никакое изменение в любом из вышеуказанных действий.

Что здесь можно сделать?

4b9b3361

Ответ 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 в корне.