首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写git存储库历史,删除除"foo“和"bar”之外的所有文件

重写git存储库历史,删除除"foo“和"bar”之外的所有文件
EN

Stack Overflow用户
提问于 2014-07-13 21:57:03
回答 3查看 378关注 0票数 1

我想删除所有在git存储库历史记录中既不是"foo“也不是"bar”的文件。考虑到rm -rf !(foo|bar)用于删除当前目录中既不是"foo“也不是"bar”的文件。我想出了以下的想法:

$ git filter-branch --tree-filter 'rm -rf !(foo|bar)' --prune-empty HEAD

然而,这产生了下面的错误,我真的不明白为什么它不能工作。

Rewrite 75c1ec1ef083338ca2e88db9cc6107c1630d91e9 (1/871)~/libexec/git-core/git-filter-branch: 1: eval: Syntax error: "(" unexpected

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-13 22:31:32

请参阅https://stackoverflow.com/a/19957874/1870481

要么使用

代码语言:javascript
复制
--tree-filter 'bash preserve-only.sh foo bar'

preserve-only.sh在一起

代码语言:javascript
复制
IFS=':'
GLOBIGNORE="$*"
rm -rf *

或使用

代码语言:javascript
复制
--index-filter \
'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- foo bar' \
 --prune-empty

最后一个特别好。只要删除一切,恢复你想要的。:)

票数 2
EN

Stack Overflow用户

发布于 2016-04-06 15:02:17

我使用了以下代码来完成这个任务:

代码语言:javascript
复制
git filter-branch -f --tree-filter "bash -O extglob -c 'rm -rf ./path/to/!(FILENAME_TO_KEEP)'" HEAD

具体来说,将-O extglob传递给bash允许您使用感叹号语法。

票数 2
EN

Stack Overflow用户

发布于 2014-07-13 22:19:39

当前的问题是!(foo|bar)是zsh特定的语法编辑:或者是extglob打开的bash,而sh中不支持。每个过滤器都由实现git-filter-branch (通常为普通sh )的shell脚本使用一个sh运行。

当然,您可以直接调用zsh (或打开extglob的bash命令)来运行该命令。或者,您可以删除不需要的文件的(坏的)名称,而不是他们没有好的名称。

(要使用filter-branch删除文件,使用--index-filter要快得多,它不需要签出每个提交和重新提交。但这是一个内部优化,只有871次提交,并不重要。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24727293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档