这是我尝试过的,但结果是奇怪的/意外的:
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/philips
,deploy/philips
和master -- deploy/philips
等变体 - 我仍然没有接近目标。 :(
修改
请不要介意这个问题。我是个白痴! master中忽略/不存在deploy目录!这就是我无法查看的原因。
答案 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