Как использовать восьмеричные символы в git checkout?

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

# deleted:  Steve_Erquiaga-Cafe_Paradiso/03 - Arioso__J.S._Bach_.flac
# deleted: "Steve_Erquiaga-Cafe_Paradiso/04 - S\303\203\302\251r\303\203\302\251nade__Rachmaninov__from_Moreaux_de_fantasie.flac"
# deleted: "Steve_Erquiaga-Cafe_Paradiso/05 - After_a_Dream__Faure___Apr\303\203\302\250s_Une_R\303\203\302\252ve_.flac"
# deleted:  Steve_Erquiaga-Cafe_Paradiso/06 - Prelude_in_C_Minor__J.S._Bach__from_The_Well-Tempered_Clavier.flac
# deleted:  Steve_Erquiaga-Cafe_Paradiso/07 - If_Dreams_Could_Dance__Erquiaga_.flac

Я уже восстановил одну песню, в названии которой не было специальных символов, используя:

$git checkout "copy/pasted-in_name_from the output above"

Однако специальные символы в некоторых именах блокируют мой упрощенный подход к их восстановлению:

$git checkout 'Steve_Erquiaga-Cafe_Paradiso/05 - After_a_Dream__Faure___Apr\303\203\302\250s_Une_R\303\203\302\252ve_.flac'

Ошибка:

pathspec 'Steve_Erquiaga-Cafe_Paradiso / 05 - After_a_Dream_Faure__Apr \ 303 \ 203 \ 302 \ 250s_Une_R \ 303 \ 203 \ 302 \ 252ve_.flac' не соответствует ни одному из файлов, известных git.

Я полагаю, что это не проблема git как таковая, а проблема с экранированием или переводом специальных символов оболочки. Я попытался поместить имя в двойные кавычки, как оно отображается, но я получил то же сообщение. Я также попробовал сделать это с внешними двойными кавычками, и перед каждой "внутренней двойной кавычкой" ставилась обратная косая черта, получая сообщение об ошибке того же типа.

Как создать команду git checkout, которая будет работать с использованием этих имен файлов?

2 ответа

Вы можете попробовать использовать printf, который понимает восьмеричные символы из 3 символов, например:

git checkout -- "$(printf "Steve_Erquiaga-Cafe_Paradiso/05 - After_a_Dream__Faure___Apr\303\203\302\250s_Une_R\303\203\302\252ve_.flac")"

Боюсь, я этого не проверял, но думаю, что это должно сработать.

Попробуйте использовать двойные кавычки вместо одинарных в вашей команде git checkout. Escape-последовательности обычно работают внутри строк в двойных кавычках, но не в одинарных.

А вот еще более простая идея, но она может стереть локальные изменения:

git checkout .
Другие вопросы по тегам