git ls-files, как избежать пробелов в путях к файлам?

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

git rm --cached `git ls-files -i --exclude-from=.gitignore`

Дело в том, что многие пути к файлам содержат пробелы.

Например:

......
Assets/Aoi Character Pack/Viewer/Resources/Aoi/Viewer BackGrounds/bg12.png.meta
Assets/Aoi Character Pack/Viewer/Resources/Aoi/Viewer BackGrounds/bg13.png.meta
Assets/Aoi Character Pack/Viewer/Resources/Aoi/Viewer BackGrounds/bg14.png.meta
Assets/Aoi Character Pack/Viewer/Resources/Aoi/Viewer BackGrounds/bg15.png.meta
Assets/Aoi Character Pack/Viewer/Resources/Aoi/Viewer BackGrounds/bg16.png.meta
Assets/Aoi Character Pack/Viewer/Resources/Aoi/Viewer BackGrounds/bg17.png.meta
Assets/Aoi Character Pack/Viewer/Resources/Aoi/Viewer BackGrounds/bg18.png.meta
.......

В целых лототах есть целые лотта-пространства, от которых мне нужно избавиться.

Я ищу элегантный способ либо:

  • A: Выйти из пробелов, например, "\"

    Assets/Aoi\ Character Pack/Viewer/Resources/Aoi/Viewer\ BackGrounds/bg18.png.meta

-или же-

  • B: есть git ls-files выкачайте мой список файлов, аккуратно заключенных в кавычки.

    'Assets/Aoi Character Pack/Viewer/Resources/Aoi/Viewer BackGrounds/bg18.png.meta'

-РЕДАКТИРОВАТЬ-

Пока я пробовал git ls-files -i --exclude-from=.gitignore | sed 's/\ /\\\ /g'

В то время как при этом успешно выводятся пути к файлам, выглядящие так, как я ожидал, с пробелами...

git rm --cached `git ls-files -i --exclude-from=.gitignore | sed 's/\ /\\\ /g'`

Я получаю - ошибка: неизвестный переключатель `\'

Где я ожидаю, что с трубкой происходит что-то вялое.

2 ответа

Канонический способ:

git ls-files -z | xargs -0 git rm

по-другому:

git ls-files | xargs -d '\n' git rm

Ответ Рэйчел Дункан направил меня в правильном направлении, и я нашел решение, которое работает! Я также позаимствовал советы из https://superuser.com/questions/401614/inserting-string-from-xargs-into-another-string

git ls-files -i --exclude-from=.gitignore | tr '\n' '\0' | xargs -0 -L1 -I '$' git rm --cached '$'

Приведенный выше скрипт компилирует список всех ваших версионных файлов git, которые теперь подпадают под правила исключения.gitignore, заключает в кавычки каждую строку std (путь к файлу), а затем выполняет git rm --cached Команда с измененной строкой.

Мне нравится этот способ, потому что терминал выдает подтверждение для каждого из файлов, которые он удаляет из системы контроля версий.

Ура!

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