我已经看了几个解决这个问题的线程。
Combining multiple git repositories
Combining multiple git repositories having a space in their name
我还查看了git filter-branch联机帮助页。
更新
我已经改为2脚本系统:
#!/bin/bash
git filter-branch --index-filter '~/doit.sh' HEAD
和doit.sh
#!/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"
这避免了之前的错误,但现在得到了这个(用[...]替换了路径):
Rewrite c35e4ef0626fb2045f57fa5b605e7663b8d06196 (1/10977)mv: cannot stat `[...]/.git-rewrite/t/../index.new': No such file or directory
index filter failed: ~/doit.sh
当我运行
时ls-files- s | sed ... | git update-index ...
我得到它应该生成的索引文件。当我更改doit.sh文件以输出sed的结果而不是将其传递给git update-index时,它似乎产生了正确的输出......似乎git update-index在下面运行时根本就不创建文件--index滤波器....
再次更新:
当我改变
mv“$ GIT_INDEX_FILE.new”“$ GIT_INDEX_FILE”
到
mv“$ GIT_INDEX_FILE.new”“$ GIT_INDEX_FILE”||真
它失败了第一个MV,但所有其他(到目前为止)都在工作。
所有这一切都在这个剧本中达到高潮:
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 /,并重写历史记录,以便文件始终存在于该目录中。
但是我收到了这个错误:
fatal: ambiguous argument 'ls-files': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
不确定如何继续,我不太了解脚本以便调试它,它直接来自git filter-branch联机帮助页。
我在手动将文件移动到子目录之前和之后尝试了这个,以防它们需要移动,或者要求它们不被移动。
答案 0 :(得分:13)
有几个问题。
1)git filter-branch --index过滤器没有正确使用'...'。
我不知道为什么会这样,git-filter的一个bug,一个环境问题?谁知道。但我能够通过将所有内容移出'...'并将其放入脚本文件来解决它。然后我在''
中调用了脚本git filter-branch --index-filter '~/doit.sh' HEAD
doit.sh:
#!/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)第一次提交为空,因此没有index.new到mv
这个git repo是使用git-svn从svn导入的。因此,第一次提交完全是空的,只是说初始svn repo初始化。因此没有移动文件,也没有index.new移动。这通过添加||来解决对于mv命令是true。但请注意,如果多个mv命令失败,则还有其他问题。
答案 1 :(得分:1)
看起来你在某些多线中断中缺少\。