【发布时间】:2011-12-09 12:48:52
【问题描述】:
我查看了几个解决此问题的线程。
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-filter....
再次更新:
当我改变时
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 手册页。
我在手动将文件移动到子目录之前和之后都试过这个,以防它需要移动它们,或者不移动它们。
【问题讨论】:
-
Brett Randall 现在已经向 Git 邮件列表提交了一个补丁,可以通过 thread.gmane.org/gmane.comp.version-control.git/270407 进行检查