我已经查看了几个关于此问题的线程。
合并多个git仓库
合并名称带空格的多个git仓库
我还查看了git filter-branch页面。
这样做避免了之前的错误,但现在出现了以下问题(路径已替换为[...]):
当我运行时
我得到了应该生成的索引文件。当我将doit.sh文件更改为输出sed的结果而不是将其传输到git update-index时,它似乎产生了正确的输出... 似乎在--index-filter下运行时git update-index根本没有创建文件...
所有这一切都在这个脚本中达到了顶峰:
理论上,这个脚本应该将仓库中的所有文件推送到data/perl_modules/目录下,并重写历史记录,以使文件一直存在于该目录下。但是我遇到了以下错误:
更新
我已经改为使用两个脚本的系统:
#!/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时,它似乎产生了正确的输出... 似乎在--index-filter下运行时git update-index根本没有创建文件...
再次更新:
当我将
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
改为
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE" || true
第一个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手册中获取。
我已经尝试过在手动将文件移动到子目录之前和之后执行此操作,以防需要移动文件或不需要移动文件。