Sea*_*vak 7 git escaping git-ls-files
在我们介绍.gitignore文件之前,已将整个BUNCH文件检入我们的git仓库.我正在尝试用以下方法清理它:
git rm --cached `git ls-files -i --exclude-from=.gitignore`
Run Code Online (Sandbox Code Playgroud)
事情是许多文件路径中都有空格.
例如:
......
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
.......
Run Code Online (Sandbox Code Playgroud)
在我需要摆脱的整个lotta文件中有一个完整的LOTTA空间.
我正在寻找一种优雅的方式:
答:例如,用"\"来逃避空格
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'`
Run Code Online (Sandbox Code Playgroud)
我明白了 - 错误:未知开关`\'
在哪里我预计管道会发生一些不稳定的事情.
小智 8
规范方式:
git ls-files -z | xargs -0 git rm
Run Code Online (Sandbox Code Playgroud)
其他方式:
git ls-files | xargs -d '\n' git rm
Run Code Online (Sandbox Code Playgroud)
雷切尔邓肯的回答让我朝着正确的方向前进,我找到了一个有效的解决方案!我还从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 '$'
Run Code Online (Sandbox Code Playgroud)
上面的脚本编译了现在属于 .gitignore 排除规则的所有版本化 git 文件的列表,在每个 std 行输出(文件路径)周围加上引号,然后git rm --cached使用修改后的字符串执行命令。
我喜欢这种方式,因为终端会为它从源代码管理中删除的每个文件发出确认。
干杯!
| 归档时间: |
|
| 查看次数: |
1147 次 |
| 最近记录: |