Git: Как я могу отменить поэтапное удаление файла с именем Unicode? - PullRequest
0 голосов
/ 18 марта 2019

enter image description here

Как показано на рисунке, я удалил файл, имя которого содержит несколько символов UniCode, и добавил его в индекс. Как отменить это действие?

Больше объяснений:

Как показывает git status, я поставил удаленный файл. Но я еще не совершил это.

К git checkout -- deleteFile заявляет:

fatal: pathspec '03.08 T&D \347\224...' did not match any files.

Автор `git rm --cached" 03.08 T & D \ 347 \ 224 ... "заявляет:

fatal: pathspec '03.08 T&D \347\224...' did not match any files. тоже.

enter image description here

Ответы [ 3 ]

2 голосов
/ 18 марта 2019

Проблема заключается в том, что имя файла содержит последовательности Unicode, представляющие не-ASCII-символы в имени файла:

$ printf '%b\n' '03.08 T&D \347\224\260\346\235\260 WeeklyReport.md'
03.08 T&D 田杰 WeeklyReport.md

Когда git status печатает имя файла, оно не уверено, если оноЭто нормально для создания китайского алфавита на вашем экране, поэтому он записывает восьмеричные значения последовательности UTF-8, которые должны были бы генерировать 田 и 杰, а не печатать их.[ Редактировать: , если вы установите core.quotePath в false, это говорит Git, что можно печатать такие символы без замены их на escape-последовательности.См. Ниже.]

Приведенная выше команда printf показывает один способ выражения имени файла таким образом, который позволяет вырезать и вставлять его.Затем вы можете использовать:

git checkout -- '03.08 T&D 田杰 WeeklyReport.md'

, чтобы получить его обратно.

Как насчет git stash?

Метод, который вы использовали - запуск git stash - позволяет сделатькоммит из внесенного вами изменения, затем запускается git reset --hard.Принятый git stash коммит находится не в какой-либо ветви.Запуск git stash list покажет коммит, который git stash сделал.Позже вы можете делать с этим все, что захотите.

Технически, git stash фактически сделал два коммитов, которые не находятся на ветке, но в этом случае только один из них сделал что-то полезное: онсохранил удаление файла, если вы действительно хотели удалить его.Это не очень сложно воспроизвести (вы можете просто удалить файл снова), поэтому вы можете просто выбросить тайник:

git stash drop

, если в нем нет ничего более ценного.

Использование core.quotePath

Опять же, у меня здесь нет вашего хранилища, поэтому мне пришлось просто догадываться о файлах.Вот что я сделал:

$ mkdir tmp/tpath; cd tmp/tpath; git init
Initialized empty Git repository in .../tmp/tpath/.git/
$ echo text > '03.08 T&D 田杰 WeeklyReport.md'
$ git add .
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   "03.08 T&D \347\224\260\346\235\260 WeeklyReport.md"

$ git config core.quotePath false
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   03.08 T&D 田杰 WeeklyReport.md

$ git commit -m initial
[master (root-commit) 5658907] initial
 1 file changed, 1 insertion(+)
 create mode 100644 03.08 T&D 田杰 WeeklyReport.md

Если вы работаете в Windows или MacOS, имейте в виду, что некоторые имена файлов UTF-8 могут столкнуться с различными проблемами перевода, аналогично случаям, когда пользователь Linux может создаватьдва разных файла с именами readme и README и передайте их.Если вы никогда не перейдете из системы Windows или MacOS в Linux и наоборот, у вас не возникнет проблем, но если вы это сделаете, то можете.(Это чаще всего проблема с акцентированными символами в именах файлов, таких как agréable или schön. Unicode имеет несколько способов написания этих имен, но MacOS, в частности, настаивает на их написании .)1051 *

1 голос
/ 18 марта 2019
git checkout HEAD -- <filepath>

Это должно работать

0 голосов
/ 18 марта 2019

Не знаю причину.Но я обошел его

git stash

Спасибо, что ответили.

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