1

这是我尝试过的,但结果很奇怪/出乎意料:

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/philips, master:deploy/philips,/deploy/philipsdeploy/philips-master -- deploy/philips我仍然没有接近目标。:(

编辑:

请不要介意这个问题。我是个白痴!部署目录被忽略/在 master 中不存在!这就是为什么我无法检查出来。

4

1 回答 1

3

这实际上非常容易使用git subtree。只需运行这个(对于每个分支):

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

现在你应该有一个newmaster包含你想要的历史的新分支。检查,删除旧的master,重命名,你就完成了。


如果你git subtree的 git 中没有,你可以在这里阅读它的文档: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

于 2013-07-11T12:26:21.643 回答