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

Exo*_*ist 7 git history

我已经看过几个解决这个问题的线程.

组合多个git存储库

组合多个git存储库,名称中包含空格

我还查看了git filter-branch手册页.


更新

我已经改为2脚本系统:

#!/bin/bash
git filter-branch --index-filter '~/doit.sh' HEAD
Run Code Online (Sandbox Code Playgroud)

和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"
Run Code Online (Sandbox Code Playgroud)

这避免了以前的错误,但现在得到了这个(用[...]替换了路径):

Rewrite c35e4ef0626fb2045f57fa5b605e7663b8d06196 (1/10977)mv: cannot stat `[...]/.git-rewrite/t/../index.new': No such file or directory
index filter failed: ~/doit.sh
Run Code Online (Sandbox Code Playgroud)

我跑的时候

ls-files- s | sed ... | git update-index ...
Run Code Online (Sandbox Code Playgroud)

我得到它应该生成的索引文件.当我更改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
Run Code Online (Sandbox Code Playgroud)

理论上,此脚本应该获取存储库中的所有文件,将它们推送到data/perl_modules /,并重写历史记录,以便看起来文件始终位于该目录中.

但是我收到此错误:

fatal: ambiguous argument 'ls-files': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
Run Code Online (Sandbox Code Playgroud)

不知道如何继续,我不太了解脚本来调试它,它直接来自git filter-branch手册页.

我在手动将文件移动到子目录之前和之后尝试了这个,以防它们需要移动,或者要求它们不被移动.

Exo*_*ist 13

有几个问题.

1)git filter-branch --index过滤器未正确使用'...'.

我不知道为什么会这样,git-filter的一个bug,一个环境问题?谁知道.但我能够通过将所有内容移出'...'并将其放入脚本文件来解决它.然后我在''里面调用了脚本

git filter-branch --index-filter '~/doit.sh' HEAD
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)

2)第一次提交是空的,所以没有index.new到mv

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

  • 我的解决方案是添加`if [-f"$ GIT_INDEX_FILE.new"]; 然后mv ... EX_FILE"; fi` - 由于某种原因,在svn(在build.info文件中)有一个合法的提交,它在git svn clone之后没有进入git.无论出于何种原因删除空提交没有选择这一个. (4认同)