我想要一个git openlast
命令来查看最后一次提交,获取添加或更改的文件列表,将它们过滤为仅文本文件,最后在编辑器中打开它们。
到目前为止,我已完成以下操作:
git show --stat HEAD
read -p "Open in Vim tabs? (Y/n)" -n 1 -r
if [[ -z $REPLY || $REPLY =~ [Yy] ]]; then
vim -p $(git diff --diff-filter=AM --ignore-submodules --name-only HEAD^)
fi
缺点是如果我在之前的提交中添加或更改二进制文件,那么它将由编辑器(在本例中为 Vim)打开。有没有办法获取命令输出的列表git diff
并删除二进制文件?
答案1
您可以通过管道传输xargs
并使用grep -Il ""
它来过滤二进制文件:
git diff --diff-filter=AM --ignore-submodules --name-only HEAD^ | \
xargs grep -Il ""
git openfiles
命令示例
#!/bin/bash
git show --stat HEAD
files=($(git diff --diff-filter=AM --ignore-submodules --name-only HEAD^ | xargs grep -Il ""))
read -p "Open ${#files[@]} files in Vim tabs? (Y/n)" -n 1 -r
if [[ -z $REPLY || $REPLY =~ [Yy] ]]; then
exec vim -p ${files[@]}
else
exit 1
fi
答案2
如果有文件扩展名,可以使用 Gawk 来在列表中选择您想要的文件。示例具有“.txt”和“.jpeg”扩展名。正则表达式用于编辑 git 的输出。
git show --stat HEAD
commit ec07d8306e9e61894d18e6f8d6ea1e5d650c0712
Author: root <root@somebox>
Date: Thu Dec 17 17:19:30 2015 -0500
test project commit
add email addresses.jpeg | Bin 0 -> 127688 bytes
allpermissions.jpeg | Bin 0 -> 126620 bytes
error.jpeg | Bin 0 -> 227469 bytes
sonic_boom.jpeg | Bin 0 -> 112958 bytes
test1.jpeg | Bin 0 -> 96857 bytes
test1.txt | 1 +
test2.txt | 1 +
top_cipher_test_results.jpeg | Bin 0 -> 149293 bytes
Gawk 删除二进制 .jpeg 扩展文件。
git show --stat HEAD|awk '{ if($1 ~ /.jpeg/)print $1}'
如果需要,包含 .txt 和 .jpeg:
git show --stat HEAD|awk '{ if($1 ~ /.jpeg|.txt/)print $1}'