【问题标题】:error combining git repositories into subdirs将 git 存储库合并到子目录时出错
【发布时间】: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 手册页。

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

【问题讨论】:

标签: git history


【解决方案1】:

有几个问题。

1) git filter-branch --index 过滤器没有正确使用“...”。

我不确定这是为什么,git-filter 的错误,环境问题?谁知道。但是我能够通过将所有内容移出“...”并将其放入脚本文件来修复它。然后我在''

中调用了脚本
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)第一次commit是空的,所以mv没有index.new

这个 git repo 是使用 git-svn 从 svn 导入的。因此,第一次提交完全是空的,只是说初始 svn repo 初始化。因此没有文件移动,也没有 index.new 移动。通过添加 || 解决了这个问题真正的 mv 命令。但是请注意,如果不止一个 mv 命令失败,您还有其他问题。

【讨论】:

  • 如果第一次提交是有问题的,最好(在我看来)将“HEAD”替换为“第二次提交的 SHA2..HEAD”。
  • @rufo 正如我在其他地方评论的那样,痛苦地证明用 REV2..HEAD 替换 HEAD 并不是一个通用的解决方案。
  • 对我来说的解决方案是添加if [ -f "$GIT_INDEX_FILE.new" ]; then mv...EX_FILE"; fi——由于某种原因,svn 中有一个合法的提交(在 build.info 文件上),在 git svn 克隆之后没有进入 git。无论出于何种原因,删除空提交并没有选择这个。
  • @Ryan 你能告诉我你把它放在哪里了吗?我也有同样的问题,很郁闷。
  • 像这样:if [ -f "$GIT_INDEX_FILE.new" ]; then mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"; fi
【解决方案2】:

看起来您在某些多行换行符中缺少 \。

【讨论】:

  • 试着把它全部变成一行以避免需要\,同样的问题。
  • 其他\符号怎么样。你有没有试图逃离他们?此外, * 可能会导致问题。从比现有脚本更简单的脚本开始,然后逐步增加复杂性(使用 \ 和 *)。
  • 这不是问题,请参阅我的最新更新。我将单引号中的所有内容替换为对包含它们曾经拥有的内容的脚本的调用。现在我得到一个不同的错误。
  • 有趣。我以前没有遇到过这样的过滤器分支问题。您是否与#git irc 频道上的人核实过?我通常在那里得到很大的帮助。同时,我会尝试自己重新创建它。
  • freenode 上的#git 频道对我的问题没什么兴趣。也许我问的时机不对?
猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2014-12-14
  • 2018-07-15
  • 2014-05-30
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多