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命令失败,则会出现其他问题。
似乎您在某些多行分隔符中丢失了。