我有几个"有趣" Git历史记录中的所有其他文件中的文件(我已触及)。我想发布有趣的"文件只有他们的历史作为Git仓库,在此仓库的历史记录中没有任何其他文件存在。
如何为git filter-branch --index-filter
编写智能脚本? (或至少对于git filter-branch --tree-filter
,这是不受欢迎的,因为它较慢,而且我保存的树木很大。)
请注意,我的问题与人们提出的最常见的类似问题有点不同1 2:如何删除特定的("敏感的")文件来自Git历史?我需要删除补充,并保留特定文件。
答案 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'