git diff branch --name-status --ignore

时间:2011-04-22 01:53:12

标签: git

有没有办法在执行git diff时忽略路径?

例如git diff branch --name-status --ignore = this / path

3 个答案:

答案 0 :(得分:2)

这有点像黑客,但你可以这样做。

git diff banch --name-status | grep -v this/path

不完全是git,但是能胜任。

答案 1 :(得分:1)

正如他们在这里说的那样:Exclude a directory from git diff,你可以使用这样的东西:

git diff --name-only $branch_name | grep -v -E "$excluding" | xargs git diff $branch_name --

...其中branch_name是另一个分支,而excluding是您要排除的模式。我不确定git-diff最终是否会提供类似的参数,我在git文档中找不到这样的选项,所以这个命令就是我现在使用的。

唯一需要注意的是您必须位于工作目录的顶层(即包含.git文件夹的同一文件夹)才能使此命令生效,因为路径是最后通过git diff --传递到xargs是相对于那个。{/ p>

您可以创建一个脚本,以便在您喜欢的shell中为您完成工作,例如

#!/bin/zsh

if [[ $# < 2 ]] ; then
    echo "Usage: \n   gdx [git-diff-params] branch_name extended_reg_exp\n"
    echo "\nExamples:\n   gdx development jpg \n   gdx --name-only master origin/master jar \n   gdx development '[a-zA-Z]+'"
    exit 1
fi

excluding="$@[-1]"
branch_name="$@[-2]"
diff_options="$@[1,-3]"

## Get a list of all the paths to include
git_paths=$(git diff --name-only $branch_name | grep -v -E "$excluding")

if [[ ${#git_paths} = 0 ]] ; then
    #no diffs
    exit 0
else
    ## Escape special characters
    git_paths=(${(f)git_paths})
    for i in {1..${#git_paths}}
    do
        git_path=$git_paths[i]
        git_path=\"${git_path//\"/\"}\"
        git_paths[i]=$git_path
    done

    ## Run the diff
    eval "git diff ${=diff_options} $branch_name -- $git_paths"
fi

这需要参数并打印用法和诸如此类的东西。我这样使用它:

gdx HEAD^ "*.jar"

答案 2 :(得分:0)

您可以将您不关心的路径添加到.gitignore文件中。

编辑:您可以使用git diff files/you/care/about查看您感兴趣的差异。

例如,如果git status显示更改了一堆文件:

modified: foo/bar
modified: foo/baz
modified: some/more/stuff
modified: and/some/more

您可以使用git diff foo查看foo目录中的更改,或git diff some/more/stuff and/some/more查看foo以外的所有内容。

如果您想查看几个文件的差异,这将没有问题,但如果您想要查看除一个或两个文件之外的所有内容,它将无法正常工作。我认为没有办法告诉git diff否定你指定的文件。

另一种选择是使用git add --interactive,但对于你正在做的事情来说,这可能有点麻烦。

事实证明,.gitignore不会忽略已经受版本控制的文件,因此这个想法永远不会起作用。忘了我提到了。 :(