我在Windows中查看分支时遇到问题。一个文件夹以空白空间结束,导致窗口自动修剪文件夹,而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 bash,所以很少有人会非常感激。
由于
答案 0 :(得分:1)
你基本上是在正确的轨道上。您的树过滤器只是在寻找错误的名称。目录的路径名不是:
"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没有它。我写了a script that does this for one file,但你想对目录中的每个文件都这样做。