重命名git中的文件夹.所有分支机构和所有修订



我在签到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,所以很少有人感谢您的帮助。

谢谢

您基本上在正确的轨道上。您的树过滤器只是在寻找错误的名称。目录的路径名不是:

"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的任何部分都不是 fast ,但这是最慢的部分。使用索引过滤器,Git可以完全跳过此步骤:它只是将提交读取到索引中,运行您的索引过滤器,然后写下索引的新提交。

不幸的是,没有良好的开箱即用的方式来编写执行此操作的索引过滤器。您基本上希望hg mv --after的GIT等效物仅在索引中重命名文件,但Git没有。我编写了一个用于一个文件的脚本,但是您想为目录中的每个文件执行此操作。

最新更新