Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将git存储库合并到子目录时出错_Git_History - Fatal编程技术网

将git存储库合并到子目录时出错

将git存储库合并到子目录时出错,git,history,Git,History,我已经研究了几个线程来解决这个问题 我还查看了git过滤器分支主页 更新 我已更改为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 up

我已经研究了几个线程来解决这个问题

我还查看了git过滤器分支主页


更新

我已更改为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"
这避免了前面的错误,但现在得到以下结果(路径替换为[…]):

当我运行

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失败,但所有其他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筛选器分支手册页


在手动将文件移动到子目录之前和之后,我都尝试过这样做,以防需要移动或不移动这些文件。

看起来您在一些多行中断中丢失了。

出现了一些问题

1)git筛选器分支--索引筛选器未正确使用“…”。

我不知道为什么这是一个git过滤器的bug,一个环境问题?谁知道呢。但我可以通过将所有内容移出“…”并将其放入脚本文件来修复它。然后,我把脚本称为“

和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)第一次提交为空,因此没有索引。mv新增


此git回购是使用git svn从svn导入的。因此,第一次提交完全是空的,只是说初始svn repo初始化。因此,没有移动任何文件,也没有要移动的index.new。通过在mv命令中添加| | true解决了这个问题。但是请注意,如果多个mv命令失败,则会出现其他问题。

尝试将所有mv命令转换为一行,以避免出现\,同样的问题。其他\符号如何。你有没有试着逃离他们?此外,*可能会引起问题。从一个比现有脚本更简单的脚本开始,并逐渐增加复杂性(使用\和*)。这不是问题所在,请参阅我的最新更新。我将单引号中的所有内容替换为对脚本的调用,该脚本包含了它们以前的内容。现在我得到一个不同的错误。有趣。我以前从未遇到过像这样的过滤器分支问题。你和git irc频道的人联系过了吗?我通常在那里得到很大的帮助。同时,我将尝试自己重新创建这个。freenode上的#git频道对我的问题没有什么兴趣。也许我问的不是时候?如果第一次提交是有问题的,那么(在我看来)用“第二次提交的SHA2..HEAD”替换“HEAD”会更好。@rufo正如我在别处评论的那样,痛苦地发现用REV2..HEAD替换HEAD不是一个通用的解决方案。我的解决方案是添加
if[-f“$GIT_INDEX_FILE.new”];然后mv…EX_文件“fi
——出于某种原因,svn中有一个合法的提交(在build.info文件上)在git svn克隆之后,这并没有进入git。而且无论出于何种原因,删除空提交都没有选中这一个。@Ryan你能告诉我你到底把它放在哪里了吗?我有完全相同的问题,这很令人沮丧。比如:
如果[-f“$git_INDEX_FILE.new”];那么mv“$git_INDEX_FILE.new”$git_INDEX_FILE"; fi
Brett Randall现在已经向Git邮件列表提交了一个补丁,可以在
git filter-branch --index-filter '~/doit.sh' HEAD
#!/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