2014-10-27 72 views
0

我试图在git repo中移动一个子目录,成为一个新的存储库(保留现有的历史记录)。git filter-branch --subdirectory-filter失败,出现“文件编号不正确 - 无法提交”

以下是关于这方面的各种建议,我克隆了现有的repo,删除了远程,现在想使用git filter-branch命令从除新目录外的新repo中删除所有内容。但是当我运行该命令时,出现错误。

$ git filter-branch --subdirectory-filter myDirectory -- --all 
C:\Program Files (x86)\Git/libexec/git-core\git-filter-branch: line 269: /libexe 
c/git-core/git: Bad file number 
Could not get the commits 

我在Windows上使用git-bash。

纵观源git的过滤分支,这个问题似乎是试图运行此命令时:

git rev-list --reverse --topo-order --default HEAD \ 
    --parents --simplify-merges $rev_args "[email protected]" > ../revs || 
    die "Could not get the commits" 

我可以毫无问题运行此命令自己 - 这取决于我代替了$ rev_args值。当我通过单提交时,一切都很好。但在脚本,它来自这里:

rev_args=$(git rev-parse --revs-only "[email protected]") 

如果我运行命令,我回来有几千提交ID的字符串。

所以我怀疑问题只是脚本试图运行的命令对于shell来说太长了,导致我看到了神秘的错误消息。

那个分析听起来是否正确?如果是这样,我该怎么办呢?

我发现了一个解决方法,我会在下面发帖,但它看起来很哈克,我希望有人知道更好的方法。

回答

0

我发现git的过滤分支我的电脑上(这是在/的libexec/git的核心/ git的过滤分支对我来说,使用Windows的git-bash)的

注释掉线287-9 (git rev-list .... || die "Could not get commits"

替换此:

rm ../revs 
for rev in $rev_args 
do 
    git rev-list --reverse --topo-order --default HEAD \ 
    --parents --simplify-merges $rev "[email protected]" >> ../revs 
done 

然后,我可以再重新运行我git filter-branch --subdirectory-filter myDirectory -- --all命令和一切都很好。

所以,这似乎是一个非常可怕的黑客攻击。

  • 有没有更好的方法?
  • 如果不是,您能否提出对此方法的改进?

谢谢!