Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git筛选器分支是否仅获取更改的文件?_Git_Phpcs - Fatal编程技术网

git筛选器分支是否仅获取更改的文件?

git筛选器分支是否仅获取更改的文件?,git,phpcs,Git,Phpcs,我们希望在大型代码库上运行git过滤器分支,重新格式化PHP文件。由于我们有超过21k个提交phpcbf希望格式化整个代码库过滤器分支的每个提交。是否可以只获取每次提交时更改的文件,并对其进行专门格式化?类似于 git filter-branch --tree-filter \ 'FILES=$(<something> | grep .php) php /usr/local/bin/phpcbf.phar $FILES || true' git过滤器分支--树过滤器\ 'FILE

我们希望在大型代码库上运行
git过滤器分支
,重新格式化PHP文件。由于我们有超过21k个提交
phpcbf
希望格式化整个代码库
过滤器分支的每个提交。是否可以只获取每次提交时更改的文件,并对其进行专门格式化?类似于

git filter-branch --tree-filter \
 'FILES=$(<something> | grep .php) php /usr/local/bin/phpcbf.phar $FILES || true'
git过滤器分支--树过滤器\
'FILES=$(| grep.php)php/usr/local/bin/phpcbf.phar$FILES | | true'
我找到了解决方案:

git filter-branch --tree-filter 'phpcbf $(\
  git show $GIT_COMMIT --name-status | egrep ^[AM] |\
    grep .php | cut -f2)' -- --all
只是简单地概述一下它正在做什么:

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

有关更多详细信息,请参阅我的博客帖子:

Elliot的解决方案让我获得了98%的成功。在过滤器分支期间,
git diff
中的某些行为似乎发生了变化(我正在运行git 2.10.2)。它不断地与我最近的头进行比较,而不是与我的父母进行比较。我可以稍微修改一下Elliot的代码,使其正常工作。在筛选过程中,我没有使用
git diff--cached--name status
,而是使用了
git show$git\u COMMIT--name status
$GIT_COMMIT
过滤器分支的每个步骤中自动设置。