【问题标题】:How to filter git diff based on file extensions?如何根据文件扩展名过滤 git diff?
【发布时间】:2012-01-23 04:42:45
【问题描述】:

是否可以将git diff 限制为给定的一组文件扩展名?

【问题讨论】:

    标签: git file-extension


    【解决方案1】:

    注意参数顺序会有所不同...例如:

    git diff master --name-only --relative -- "**/*.ts" "**/*.tsx" "**/*.js" "**/*.jsx" "**/*.vue"
    

    'diff'后面需要跟'master'

    【讨论】:

    • 使用**/*.ext 不会捕获foo.ext(不在文件夹中)。所以应该是***.ext 等等。
    【解决方案2】:

    在 git 版本 2.18.0 上测试过,文件扩展名应该用双引号引起来。如果你想找到本地仓库和远程仓库之间的最后一个差异,拉取之后,你可以使用:

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

    例如:

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

    【讨论】:

    • 当我提供时它对我有用——在扩展之前,就像这样,git diff master@{1} origin/master --name-only -- "*.cs"
    【解决方案3】:

    递归地包含文件(包括当前目录)这对我有用:

    git diff -- '***.py'
    

    【讨论】:

    • 对我来说这是最好的解决方案。您还可以排除一些文件/目录。例如:git diff -- '***.py' ':!.Trashes'
    • 三个星号有什么作用(与单个星号相比)?
    • IIRC 双星号表示(可能)嵌套目录(甚至是空的),单星号和 .py 表示文件名。所以它应该是当前目录或任何嵌套目录中的 *.py 文件。
    【解决方案4】:

    我结束了这个:

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

    仅当文件名包含单词“test”(不区分大小写)且不以 .sql 结尾时,才会显示指定提交的差异,请根据您的情况修改管道。

    【讨论】:

      【解决方案5】:

      git diff 只会显示未暂存文件中的差异。

      我发现这个问题是因为我想从git diff 中排除.info 文件。我通过使用git add *.info 暂存它来实现这一点,这减少了剩余的文件。

      【讨论】:

        【解决方案6】:

        在 Windows 上的 git bash 下,以上答案似乎都不适合我。我不确定它是版本的东西(我使用的是 1.8.4)还是 Windows/bash 的东西;另外,就我而言,我想区分两个分支,其中每个分支都有另一个分支中不存在的附加文件(因此基于“查找”的文件是疏忽的)。

        无论如何这对我有用(在我的示例中,寻找 python 文件之间的差异):

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

        【讨论】:

        【解决方案7】:

        要么使用你的 shell 的 globstar(它进行递归搜索)1,2:

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

        或使用查找:

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

        这两个都是特殊名称和空格证明。虽然您可能想要过滤具有 .py 扩展名的目录:)


        1 我通常喜欢git diff -- {.,**}/*.py

        2 启用 globstar 后,git diff -- **/*.py 已包含 ./*.py。在 Bash 的手册页中:'如果后跟 /,两个相邻的 * 将仅匹配目录和子目录。'

        【讨论】:

        • 如果 repo 中没有 python 文件,find 版本将不起作用。所以如果你有一个全局钩子,你将开始区分非 python 文件:(
        【解决方案8】:

        扩展的命令行参数。

        git diff *.py
        

        或者,您可以将find 导入git diff

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

        【讨论】:

        • 请让答案更具可读性。你可以用git diff *.py 就足够了,不用大喊大叫的标题
        • “喊出标题”是 shell 脚本中的 #-cmets。
        • 这是唯一对我有用的解决方案,引号(等)在 Windows 命令提示符下不起作用。
        • 最新的 git 版本现已破坏/删除此功能。根据下面@marjan.javid 的回答,它现在需要双引号。对此没有任何警告,git-diff 刚刚停止工作:(。花了一段时间才弄清楚发生了什么变化(以及为什么 git-diff 现在对于以前总是有效的相同输入返回零结果)。
        【解决方案9】:

        是的,如果你确保 git 扩展一个 glob 而不是你的 shell,那么它将在任何级别匹配,所以像这样的东西(引号很重要)应该可以正常工作。

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

        【讨论】:

        • 好吧,我的 git 版本太旧了。与 1.7.8 中宣传的一样工作。很棒。
        • 我的使用了大括号扩展,例如 git diff -- *.{c,h,etc}
        • 双破折号很重要,例如。 git diff master HEAD -- "*filename.txt" 也有用的是git diff master HEAD --name-only
        • 也必须在 git 仓库的根目录下进行。
        • 可能是一个有趣的注释:在 Windows 上使用需要双引号。
        【解决方案10】:

        对于简单的文件模式,这似乎可行:

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

        空格安全,你也可以有多个扩展:

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

        【讨论】:

          猜你喜欢
          • 2010-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-03
          • 2019-05-22
          • 1970-01-01
          • 2011-12-17
          相关资源
          最近更新 更多