git статус показывает, что существующие файлы были удалены - PullRequest
0 голосов
/ 04 апреля 2020

Запуск git status Я вижу несколько файлов, помеченных deleted:

On branch my-branch
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    deleted:    nta/executor/.gitignore
    deleted:    nta/executor/NTA_EXECUTOR_README.md
    deleted:    nta/pom.xml
    ...

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

git restore --staged nta/executor/.gitignore

. Это работало с некоторыми файлами, но многие другие остаются в списке как deleted.

Ряд других Вопросы SO описывают похожие проблемы:

, но методы, описанные в нем, не решили мою конкретную проблему. Я попытался

git reset <file>
git reset --hard <file>  # fatal: Cannot do hard reset with paths.
git reset -- <file>
git checkout -- <file>

без удачи. Любые другие идеи?


Дополнительно

Если это поможет, вот описание, вероятно, глупости, которую я сделал, чтобы попасть сюда:

Я хотел поставить номер файлов с именем foo в различных каталогах:

git add */*/foo

В результате было добавлено гораздо больше foo s, чем я ожидал. Поэтому я попытался откатить:

git restore --staged  */*/foo

И вдруг тонна файлов, не являющихся foo, была указана как deleted

(и теперь вы знаете остальную часть истории)

1 Ответ

0 голосов
/ 04 апреля 2020

Исходя из комментариев , похоже, что в вашей версии Git может быть какая-то ошибка. Простое git reset (без каких-либо аргументов) должно было бы устранить проблему, но на самом деле сначала нужно было удалить файл индекса, а затем выполнить сброс:

rm .git/index
git reset

Это git reset будет перестройте индексный файл с нуля, теперь, когда он отсутствует. В этом нет необходимости. (Обратите внимание, что расположение индексного файла зависит от того, является ли это добавленное рабочее дерево из git worktree add; в приведенном выше предположении это не так.)

( Одна из возможных возможных причин этого заключается в том, что Windows имеет режимы, в которых она не позволяет программе записывать в файл. 1 Но это должно отображаться как ошибка при запуске git reset. предотвратить удаление файла, в этом случае rm .git/index тоже не удастся. Так что совсем не ясно, что здесь происходит.)

Оригинальный ответ ниже.


1 Windows имеет так называемые «обязательные блокировки файлов». Программы не могут избежать этих блокировок. Linux обычно имеет только рекомендованную блокировку файлов, хотя некоторые файловые системы Linux имеют дополнительные функции. См., Например, Как мне сделать Windows блокировку файла более похожей на UNIX блокировку файла?


Как сказал Мэтт в комментарии это означает, что вы Git удалили индексную копию этих файлов. Поэтому, сравнивая коммит HEAD с предлагаемым следующим коммитом, будет разница - если вы на самом деле делаете коммит прямо сейчас - что эти файлы не будут в следующем коммите, т.е. между этими двумя коммитами вы удалили файлы.

Чтобы положить один файл обратно, следуйте инструкциям, которые напечатаны git status:

  (use "git restore --staged <file>..." to unstage)

т.е. выполните:

git restore --staged nta/executor/.gitignore

скопировать HEAD копию nta/executor/.gitignore обратно в индекс Git. Теперь копия HEAD и предложенная индексом копия соответствуют следующему коммиту, а git status больше не будет упоминать файл. При необходимости повторите для каждого файла.

При желании вы можете массово перезаписать весь индекс (весь предложенный следующий коммит) из текущего коммита с помощью:

git reset

(или git reset --mixed, но по умолчанию --mixed).

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

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

Мы могли бы использовать более подробную информацию по этому вопросу, такую ​​как фактическое вырезание и вставка до и после git status (или его части) и выбранная команда git restore. Он определенно должен go вернуться в состояние, которое было в коммите HEAD, после чего git status должен молчать об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...