树过滤器:如何删除除一个目录之外的所有目录?

时间:2013-07-11 12:15:50

标签: git

这是我尝试过的,但结果是奇怪的/意外的:

git filter-branch -f --tree-filter \
'for f in $(ls); do if [ "$f" != "deploy" ]; \
then rm -rf "./$f"; fi done; mv "./deploy/philips/*" .; \
rm -rf "./deploy"' --prune-empty HEAD

格式化以便于阅读。实际上这只是一条线。

发生的情况是mv失败,因为剩下一些文件,前一个循环没有删除。该操作完成“成功”处理所有提交,但效果是根目录中保留的内容不会被过滤/只有一小部分提交。

所以,我有两个问题:

  • 是否有更简单的方法从特定分支中清除除一个目录以外的所有目录?

  • 如果filter-branch是可行的方法,我可以堆叠多个过滤器吗?它似乎以随机顺序执行过滤器。这是真的吗?

PS。如果我可以在牺牲提交历史的同时简化它 - 这是一个可接受的解决方案。

也试过这样的事情:

$ git banch
  master
  preliminary
* release-0.6.3

$ git checkout release-0.6.3 master/deploy/philips

还尝试了master:/deploy/philipsmaster:deploy/philips/deploy/philipsdeploy/philipsmaster -- deploy/philips等变体 - 我仍然没有接近目标。 :(

修改

请不要介意这个问题。我是个白痴! master中忽略/不存在deploy目录!这就是我无法查看的原因。

1 个答案:

答案 0 :(得分:3)

使用git subtree实际上非常简单。只需运行此(对于每个分支):

git branch newmaster `git subtree split -P deploy/philips`

现在您应该有一个包含所需历史记录的新分支newmaster。检查一下,删除旧的master,重命名,然后就完成了。


如果您的git中没有git subtree,可以在此处阅读其文档:https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt并安装它,只需下载此文件并将其放入git-core文件夹中(在cygwin中…\cygwin\lib\git-core):

https://raw.github.com/git/git/master/contrib/subtree/git-subtree.sh