git filter-branch --subdirectory-filter失败,出现“文件编号错误 - 无法获取提交”

时间:2014-10-27 18:33:26

标签: git git-bash git-filter-branch

我正在尝试在我的git仓库中移动一个子目录,以成为一个新的存储库(保留现有的历史记录)。

在网上为此提出了各种建议,我克隆了现有的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-filter-branch的源代码,问题似乎是在尝试运行此命令时:

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

我可以自己运行此命令而不会出现问题 - 取决于我替换$ rev_args值的内容。当我通过单一提交时,一切都很好。但是在剧本中,它来自这里:

rev_args=$(git rev-parse --revs-only "$@")

如果我运行该命令,我会收到一个包含数千个提交ID的字符串。

所以我怀疑问题只是脚本试图运行的命令太长而shell无法处理,导致我看到的神秘错误消息。

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

我找到了一个我将在下面发布的解决方法,但它似乎非常hacky,我希望有人知道更好的方法。

1 个答案:

答案 0 :(得分:0)

我在我的电脑上发现了git-filter-branch(对于我来说这是/ libexec / git-core / git-filter-branch,在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 "$@" >> ../revs
done

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

所以,这似乎是一个非常糟糕的黑客。

  • 有更好的方法吗?
  • 如果没有,您能否建议对此方法进行任何改进?

谢谢!