11

在我们引入 .gitignore 文件之前,我们的 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 文件中的 WHOLE LOTTA SPACES。

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

  • 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'`

我得到 - 错误:未知开关 `\'

我预计管道会发生一些奇怪的事情。

4

2 回答 2

13

规范的方式:

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

另一种方式:

git ls-files | xargs -d '\n' git rm
于 2016-02-11T01:28:30.197 回答
5

雷切尔邓肯的回答让我朝着正确的方向前进,我找到了一个可行的解决方案!我还从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使用修改后的字符串执行命令。

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

干杯!

于 2016-02-11T02:04:46.467 回答