关于历史:将Git存储库组合到子目录时出错

error combining git repositories into subdirs

我已经看了几个线程来处理这个问题。

组合多个Git存储库

组合多个名称中有空间的Git存储库

我还查看了git过滤器分支手册页。

更新

我已改为2脚本系统:

1
2
#!/bin/bash
git filter-branch --index-filter '~/doit.sh' HEAD

和do.SH

1
2
3
4
5
#!/bin/bash
git ls-files -s | \
    sed"s-\t-&data/perl_modules/-" | \
    GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info && \
    mv"$GIT_INDEX_FILE.new""$GIT_INDEX_FILE"

这避免了前面的错误,但现在得到了(用[…]替换了路径):

1
2
Rewrite c35e4ef0626fb2045f57fa5b605e7663b8d06196 (1/10977)mv: cannot stat `[...]/.git-rewrite/t/../index.new': No such file or directory
index filter failed: ~/doit.sh

当我运行

1
ls-files- s | sed ... | git update-index ...

我得到它应该生成的索引文件。另外,当我更改doit.sh文件以输出sed的结果,而不是将其传输到git update索引时,它似乎会生成正确的输出…似乎git update index在--index filter….下运行时并没有创建文件。

再次更新:

当我改变

mv"$git_index_file.new""$git_index_file"

mv"$git_index_file.new""$git_index_file"真

它在第一个MV中失败,但其他所有的(到目前为止)都在工作。

所有这些都以这个脚本结束:

1
2
3
4
5
git filter-branch --index-filter \
    'git ls-files -s | sed"s-\t"*-&data/perl_modules/-" |
            GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                    git update-index --index-info &&
     mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD

理论上,这个脚本应该获取存储库中的所有文件,将它们推送到data/perl_modules/中,并重写历史记录,以使文件始终位于该目录中。

但是我得到这个错误:

1
2
fatal: ambiguous argument 'ls-files': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

不确定如何继续,我对脚本的理解不够好,无法对其进行调试,它直接取自git filter branch手册页。

在手动将文件移动到子目录之前和之后,我都尝试过这样做,以防需要移动文件或不需要移动文件。


有几个问题。

1)git filter branch--索引筛选器未正确使用"…"。

我不知道这是为什么,一个Git过滤器的bug,一个环境问题?谁知道呢。但我可以通过将所有内容移出"…"并将其放入脚本文件来修复它。然后我把剧本叫做

1
git filter-branch --index-filter '~/doit.sh' HEAD

和doIT.SH:

1
2
3
4
5
6
7
#!/bin/bash

git ls-files -s | \
    sed"s-\t-&data/perl_modules/-" | \
    GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info

mv"$GIT_INDEX_FILE.new""$GIT_INDEX_FILE" || true

2)第一次提交是空的,因此没有对mv的index.new

此git repo是使用git svn从svn导入的。因此,第一次提交完全是空的,只需说初始的SVN repo初始化。因此,没有移动任何文件,也没有要移动的index.new。这是通过在mv命令中添加true来解决的。但是请注意,如果多个mv命令失败,则会出现其他问题。


似乎您在某些多行分隔符中丢失了。