我正在尝试在我的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,我希望有人知道更好的方法。
答案 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
命令,一切都很好。
所以,这似乎是一个非常糟糕的黑客。
谢谢!