首先,
git status --porcelain=v1 -uno | cut -c4-
可用于获取跟踪的文件名列表,无论是暂存的还是未暂存的;
git status --porcelain=v1 -uno | grep -e '^.[^ ]' | cut -c4-
如果您想跳过暂存文件,可以使用。
然后,您可以将您在 git 别名中提到的命令(git log -1 --format=%cd 和 date -r)与 bash 组合起来one-liner:
$ git config --global alias.lastdates '!f(){ if [ $# -gt 0 ]; then printf "%s\n" "$@"; else git status --porcelain=v1 -uno | grep -e '\''^.[^ ]'\'' | cut -c4-; fi | tr '\''\n'\'' '\''\0'\'' | xargs -0 bash -c '\''for arg; do echo -e "$arg:\n $(git log -1 --format=%cd --date=iso-strict HEAD -- "$arg") -> $(date -Is -r "$arg" 2>/dev/null || echo "N/A")"; done'\'' bash; }; f'
$ git lastdates
$ git lastdates file-names…
更多详情
详细说明一下脚本:
$ git config --global alias.lastdates '!f(){ \
样板 - 参见例如this page
if [ $# -gt 0 ]; then printf "%s\n" "$@"; \
处理 file-names… 参数(在单独的行中打印每个参数)
else git status --porcelain=v1 -uno | grep -e '\''^.[^ ]'\'' | cut -c4-; fi \
与上面相同的代码,转义引号
| tr '\''\n'\'' '\''\0'\'' | xargs -0 bash -c \
将每一行(可能包含空格的文件名)传递给以下脚本
'\''for arg; do \
迭代每个参数(文件名)
echo -e "$arg:\n $(git log -1 --format=%cd --date=iso-strict HEAD -- "$arg")
从当前分支打印文件名和提交日期 (HEAD)
-> $(date -Is -r "$arg" 2>/dev/null || echo "N/A")"; done'\'' \
打印文件名的日期,如果出现错误,则打印 N/A(如果文件已提交-然后-删除)
bash; }; f'
样板代码 - 最后一个 bash 字符串是必需的,因为在运行“内联脚本”(bash -c "…" bash other-arguments…)时它将被提升为 $0