找不到过滤某些文件类型的区别?我只想在分支a和b之间比较.js文件?
答案 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$'