Git: Как я могу отменить поэтапное удаление файла с именем Unicode?

Вероятно (это случилось со мной), команда ls говорит, что она не существует , потому что у текущего пользователя нет разрешений для доступа к этому каталогу или файлу.

Удалите блокировку и убедитесь, что вы выполняете git с нужным пользователем, чтобы избежать проблем с правами.

Если вы находитесь в поле GNU / Linux с sudo :

sudo rm project_path / .git / index.lock

0
задан Jeff Tian 18 March 2019 в 05:25
поделиться

3 ответа

Проблема здесь в том, что имя файла содержит последовательности 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, в частности, настаивает на их написании , как .) [ 1134]

0
ответ дан torek 18 March 2019 в 05:25
поделиться

Не знаю причину. Но я работал над этим

git stash

Спасибо за ответ.

0
ответ дан Jeff Tian 18 March 2019 в 05:25
поделиться
git checkout HEAD -- <filepath>

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

0
ответ дан eftshift0 18 March 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: