Почему git игнорирует мой измененный файл? - PullRequest
15 голосов
/ 25 августа 2009

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

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

git add /path/to/file не имеет никакого эффекта.

git add -f /path/to/file не имеет никакого эффекта.

git status /path/to/file показывает файл как в блоке «изменения должны быть зафиксированы».

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

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

Что здесь может происходить?

Ответы [ 9 ]

26 голосов
/ 07 января 2014

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

git update-index --assume-unchanged path/to/file

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

Если вы сказали git, что файл не изменился, вам придется:

git update-index --no-assume-unchanged path/to/file

или просто переклонируйте репо, как я закончил, прежде чем вспомнил, что я сделал ...

17 голосов
/ 26 июня 2015

Оказывается, я добавил 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
9 голосов
/ 25 августа 2009

Существует две основные причины, по которым Git игнорирует файл: gitignore и submodules.

Чтобы быть более точным, следующие условия заставят Git игнорировать файл при вызове 'git add':

  1. Файл соответствует шаблону в $GIT_DIR/exclude.
  2. Файл соответствует шаблону в файле .gitignore внутри репо.
  3. Файл соответствует шаблону в пользовательском файле .gitignore (указан 'git config --global core.excludesfile').
  4. Файл является частью подмодуля.

Дополнительную информацию можно найти в другом вопросе SO:

Невозможно отследить файлы в подмодулях Git

6 голосов
/ 27 августа 2009

Проверка с использованием

$ git ls-files --exclude-standard --ignore

, если файл действительно не исключен (есть и другие исключающие файлы, кроме .gitignore ).

4 голосов
/ 25 августа 2009

Вы проверяете свой глобальный файл git ignore?

git config --global --get-all core.excludesfile
git config --system --get-all core.excludesfile

Если кто-либо из них возвращает файл в качестве значения, посмотрите в этом файле.

2 голосов
/ 25 августа 2009

если ваш файл находится в корзине «Изменения будут зафиксированы», git уже распознал изменение и собирается его зафиксировать! Его в индексе уже . В противном случае он будет в корзине «Изменен, но не обновлен».

:)

Надеюсь, это поможет /

1 голос
/ 25 августа 2009

Вы уверены, что ваш файл не исключен некоторыми файлами .gitignore в родительских каталогах?

0 голосов
/ 15 июля 2014

Проверьте каждый родительский каталог из файла в корне проекта на наличие файлов .gitignore.

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

0 голосов
/ 25 августа 2009

После того, как вы сделали git add, вы сделали коммит, так что он фактически находится в репо и может быть сравнен с (измененной) рабочей копией?

...