How to filter git diff based on file extensions?

时光总嘲笑我的痴心妄想 提交于 2019-11-27 17:08:52

Yes, if you ensure that git expands a glob rather than your shell then it will match at any level so something like this (quotes are important) should work fine.

git diff -- '*.c' '*.h'
sehe

Either use your shell's globstar (which does a recursive search)1,2:

shopt -s globstar 
git diff -- *.py **/*.py

or use find:

find -name '*.py' -print0 | xargs -0 git diff --

Both of these are special-names and whitespace proof. Although you might want to filter for directories having the .py extension :)


1 I like to do git diff -- {.,**}/*.py usually

2 When globstar is enabled, git diff -- **/*.py already includes ./*.py. In Bash's manpage: 'If followed by a /, two adjacent *s will match only directories and subdirectories.'

To include files recursively (including current dir) this worked for me:

git diff -- '***.py'

For simple file patterns, this seems to work:

$ git ls-files -zm '*.txt' | xargs --null git diff

Whitespace safe, and you can have multiple extensions too:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff

Command line argument for extension.

git diff *.py

In the alternative, you can pipe find into git diff:

find . -name '*.py' -type f | git diff --

None of the answers above seem to work for me under git bash on Windows. I am not sure if it is a version thing (I'm using 1.8.4) or Windows/bash thing; also, in my case, I wanted to diff two branches where each branch had additional files not present in the other branch (thus the 'find' based ones are remiss).

Anyway this worked for me (in my example, looking for a diff between python files):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`

git diff will only show differences in unstaged files.

I found this question because I wanted to exclude .info files from git diff. I achieved this by staging it with git add *.info, which reduces the files left.

I wound up with this:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

This shows diffs for the specified commit only if the filename contains the word 'test' (case insensitive) and does not end with .sql, modify the pipeline as necessary for your case.

As I tested on git version 2.18.0, we should write the file extension between double quotation. If u want find the last differences between local repository and the remote one, after pulling, you can write it like below:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

For example:

git diff master@{1} origin/master --name-only "*.cs"

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!