在Git中重命名文件夹。所有分支机构和所有修订

时间:2017-05-02 14:10:05

标签: git bash git-bash

我在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,所以很少有人会非常感激。

由于

1 个答案:

答案 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,但你想对目录中的每个文件都这样做。