【问题标题】:remove all but selected files in all Git commits在所有 Git 提交中删除所有未选择的文件
【发布时间】:2016-12-22 11:41:27
【问题描述】:

在 Git 历史记录中的所有其他文件中,我有几个“有趣”的文件(我已经接触过)。而且我只想将“有趣”的文件发布为 Git 存储库的历史记录,而不会在此存储库的历史记录中出现任何其他文件。

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

请注意,我的问题与人们问的最常见的类似问题有点不同 12如何从 Git 历史记录中删除特定(“敏感”)文件?我需要删除补码,并保留特定文件。

【问题讨论】:

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


    【解决方案1】:

    因此,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 次提交之间的差异中修改或添加(例如,“上游”提交和您的最后一次提交) )。

    这是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'
    

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 2011-06-02
      • 2013-02-13
      • 2018-12-02
      • 1970-01-01
      • 2018-11-14
      • 2022-06-29
      • 2012-12-12
      相关资源
      最近更新 更多