我在窗口查看一个分支的时候遇到了问题。其中一个文件夹以空空间结束,导致窗口自动调整文件夹,而git试图将文件放入原始路径并导致错误。
fatal: cannot create directory at 'raisesoft/61571_delivery /acl': No such file or directory在linux上,它工作得很好,因为linux不会自动修剪文件夹。
我想重命名那个文件夹。这就是我想出的剧本:
git filter-branch --tree-filter '
if [ -d "61571_delivery " ]; then
mv "61571_delivery " "61571_delivery"
fi' --force HEAD但是它不起作用。它根本没有重命名文件夹。我不精通linux,所以很少的帮助是非常感谢的。
谢谢
发布于 2017-05-02 16:01:10
你基本上是在正确的轨道上。你的树过滤器只是找错了名字。目录的路径名不是:
"61571_delivery "(完整的尾随空间需要一个引号来表示清楚),而是:
"raisesoft/61571_delivery "因此:
git filter-branch --tree-filter '
if [ -d "61571_delivery " ]; then
mv "61571_delivery " "61571_delivery"
fi' --force HEAD应改为:
git filter-branch --tree-filter '
if [ -d "raisesoft/61571_delivery " ]; then
mv "raisesoft/61571_delivery " "raisesoft/61571_delivery"
fi' --force HEAD(一旦您测试了它并发现它工作正常,切换到--all并添加--tag-name-filter cat以使带注释的标记也得到更改)。
值得注意的是,--tree-filter非常慢。在大型存储库中,在旋转介质(而不是SSD或内存文件系统)上执行此操作可能需要数天甚至几周。通过使用内存文件系统,可以大大加快速度,但最大的加速来自于使用--index-filter而不是--tree-filter。使用树过滤器,Git必须将索引中的每个提交提取为常规的文件系统树,运行筛选器,然后将树转换回它可以用来编写新提交的索引。虽然git filter-branch中没有任何部分是快速的,但这是最慢的部分。使用索引过滤器,Git可以完全跳过这一步:它只是将提交读入索引,运行索引过滤器,然后从索引中写入新的提交。
不幸的是,没有一个好的开箱即用的方法来编写一个索引过滤器来实现这一点。基本上,您希望Git等效的hg mv --after只在索引中重命名文件,但是Git没有它。我编写了为一个文件执行此操作的脚本,但是您希望对目录中的每个文件都这样做。
https://stackoverflow.com/questions/43740047
复制相似问题