在 Windows 中签出分支时遇到问题。一个文件夹以一个空格结尾,导致 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
是快速的,但这是最慢的部分。使用索引过滤器,Git 可以完全跳过这一步:它只是将提交读入索引,运行你的索引过滤器,然后从索引中写入一个新的提交。
不幸的是,没有好的开箱即用的方法来编写一个索引过滤器来做到这一点。您基本上只希望 Git 等效hg mv --after
于重命名索引中的文件——但 Git 没有它。我写了一个脚本,为一个文件执行此操作,但您希望为目录中的每个文件执行此操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句