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
Команда с измененной строкой.
Мне нравится этот способ, потому что терминал выдает подтверждение для каждого из файлов, которые он удаляет из системы контроля версий.
Ура!