【问题标题】:git filter-branch get only changed files?git filter-branch 只获取更改的文件?
【发布时间】:2017-09-19 15:28:25
【问题描述】:

我们希望在重新格式化 PHP 文件的大型代码库上运行 git filter-branch。由于我们有超过 21k 次提交,phpcbf 想要格式化整个代码库,每次提交 filter-branch。是否可以只获取每次提交更改的文件并专门格式化它们?有点像...

git filter-branch --tree-filter \
 'FILES=$(<something> | grep .php) php /usr/local/bin/phpcbf.phar $FILES || true'

【问题讨论】:

    标签: git phpcs


    【解决方案1】:

    我找到了解决办法:

    git filter-branch --tree-filter 'phpcbf $(\
      git show $GIT_COMMIT --name-status | egrep ^[AM] |\
        grep .php | cut -f2)' -- --all
    

    只是为了快速概述一下它在做什么:

    • git show $GIT_COMMIT --name-status 将返回该提交的所有修改文件。
    • egrep ^[AM] 将雕像过滤到仅添加和修改。无需尝试格式化正在删除的文件。
    • grep .php 仅格式化 PHP 文件。
    • cut -f2 从列表中删除状态前缀,因此我们只获取原始文件路径。

    查看我的博文了解更多详情:https://elliot.land/post/reformatting-your-codebase-with-git-filter-branch

    【讨论】:

    • Elliot 的解决方案让我成功了 98%。在过滤器分支期间git diff 中的某些行为似乎发生了变化(我正在运行 git 2.10.2)。它不断地与我最新的 HEAD 进行比较,而不是过滤提交的父级。我能够稍微更改 Elliot 的代码以使其正常工作。在过滤器期间,我使用了git show $GIT_COMMIT --name-status,而不是git diff --cached --name-status$GIT_COMMITfilter-branch 的每个步骤中自动设置。
    • 我发现git show $GIT_COMMIT --name-only --pretty=oneline|tail -n +2git show $GIT_COMMIT --name-status | egrep ^[AM] 更健壮请注意,它还会返回已删除的文件,因此您可能需要测试文件是否存在。
    猜你喜欢
    • 2013-03-29
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2020-07-22
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    相关资源
    最近更新 更多