删除所有Git提交中除所选文件以外的所有文件

时间:2016-12-22 11:41:28

标签: git bash pattern-matching glob git-filter-branch

我有几个"有趣" Git历史记录中的所有其他文件中的文件(我已触及)。我想发布有趣的"文件只有他们的历史作为Git仓库,在此仓库的历史记录中没有任何其他文件存在。

如何为git filter-branch --index-filter编写智能脚本? (或至少对于git filter-branch --tree-filter,这是不受欢迎的,因为它较慢,而且我保存的树木很大。)

请注意,我的问题与人们提出的最常见的类似问题有点不同1 2如何删除特定的("敏感的")文件来自Git历史?我需要删除补充,并保留特定文件。

1 个答案:

答案 0 :(得分:0)

因此,git filter-branch --index-filter脚本中的棘手部分是从索引中获取文件列表,过滤掉特定文件,然后删除结果列表。

我已将其实现为单独的可执行脚本git-update-index-keeping-only;这是粗略的实施:

git ls-files --full-name \
| fgrep -v -x -f <(echo "$FILELIST") \
| xargs git rm --cached "$@" --

我还没想过文件名中的换行符和空格会发生什么(空格必须是xargs的问题,除非它被告知再次为每个参数调用命令,我没有效率。)

示例用法写在另一个对我的用例有用的脚本中:获取有趣的列表,如在2次提交之间的差异中修改或添加的那些(例如,&#34;上游&#34;提交和您的最后一次最重要的是承诺。

它的git-filter-only-files-modified-since;它的本质是这样的:

FILES="$(git diff-tree "$SINCE": HEAD: \
   -r --name-only --diff-filter=MACRT)"
export FILES
git filter-branch \
   --index-filter 'echo "$FILES" | git-update-index-keeping-only -q'