git ls-files,如何转义文件路径中的空格?

时间:2016-02-10 21:24:10

标签: git escaping git-ls-files

在我们介绍.gitignore文件之前,已将整个BU​​NCH文件检入我们的git repo。我正在尝试用以下方法清理它:

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
.......

我需要摆脱整个lotta文件中的整个LOTTA空间。

我正在寻找一种优雅的方式:

  • 答:使用“\”转义空格,例如

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

-OR -

  • 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 个答案:

答案 0 :(得分:6)

规范方式:

git ls-files -z | xargs -0 git rm
另一种方式:

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

答案 1 :(得分:3)

Rachel Duncan的回答让我找到了正确的方向,我找到了一个有效的解决方案!我还借用了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排除规则,在每个标准行(文件路径)周围包装引号,然后执行git rm --cached命令修改过的字符

我喜欢这种方式,因为终端会对从源代码管理中删除的每个文件发出确认。

干杯!