如何根据特定文件扩展名获得2个分支之间的区别?

时间:2018-12-18 05:53:22

标签: git

找不到过滤某些文件类型的区别?我只想在分支a和b之间比较.js文件?

1 个答案:

答案 0 :(得分:3)

这简单吗?

git diff branch-a branch-b -- '*.js'

如果您想获得更完整的视图:

git diff branch-a branch-b -- $(cat <(git ls-tree --name-only -r branch-a) <(git ls-tree --name-only -r branch-b) | sort | uniq | grep '\.js$')

此超长命令有什么作用?

这部分应该很明显,该部分末尾的--表示所有后续参数都是文件路径,而不是选项

git diff branch-a branch-b --

让我们看一下这个巨大的命令:

$(cat <(git ls-tree --name-only -r branch-a) <(git ls-tree --name-only -r branch-b) | sort | uniq | grep '\.js$')

第一件事是这个

cat <(git ls-tree --name-only -r branch-a) <(git ls-tree --name-only -r branch-b)

这使用git ls-tree列出提交中的所有文件,并使用cat收集两个分支中文件的输出。 <()是一个外壳替换,由管道名称替换。管道的另一端显然是git ls-tree的输出。

| sort | uniq | grep '\.js$'

排序并过滤合并的文件-实际上,可能有重复的文件,因此uniq会将重复的文件取出。末尾的grep '\.js$'过滤器仅显示路径以.js结尾的文件。

$()中long命令的结果是两个分支中合并的.js文件,然后将它们传递到git diff以过滤差异文件。如果我正确理解的话,这正是您想要的。


如何将其打包到方便的shell脚本中以备后用?

#!/bin/sh
SOURCE=${1:-master}
TARGET=${2:-HEAD}
FILTER=${3:-.*}
exec git diff $SOURCE $TARGET -- $(cat <(git ls-tree --name-only -r $SOURCE) <(git ls-tree --name-only -r $TARGET) | sort | uniq | grep "$FILTER")

用法:

./diff-all.sh branch-a branch-b '\.js$'