【问题标题】:Display last commit and last modification date for files with changes not staged显示未暂存更改的文件的最后提交和最后修改日期
【发布时间】:2020-05-08 16:06:14
【问题描述】:

我是一个 Linux/终端爱好者,我想有一个快速的方法来做以下两件事:

  1. 对于所有显示为“未暂存的更改”的文件,当我 执行“git status”,显示每个文件名的列表,它们的最后一次提交 日期,以及它们的最后修改日期。
  2. 与 #1 相同,但可以选择手动指定我想要的文件 显示最后提交和最后修改日期。

到目前为止,我已经能够设置一个别名来显示给定文件的最后提交日期(尽管这没有列出文件名):

alias lastc='git log -1 --format=%cd'

我还设法为给定文件一次性获得了我想要的两个日期:

lastc do/9_sample_selection.do && date -r "$_"

但我不知道如何使用更简单的别名(例如 lastdates 文件名)来完成这最后一件事,如何对执行“git status”时出现的所有文件执行此操作,以及如何在日期旁边的输出。

非常感谢任何帮助。

【问题讨论】:

    标签: git terminal


    【解决方案1】:

    首先,

    git status --porcelain=v1 -uno | cut -c4-
    

    可用于获取跟踪的文件名列表,无论是暂存的还是未暂存的;

    git status --porcelain=v1 -uno | grep -e '^.[^ ]' | cut -c4-
    

    如果您想跳过暂存文件,可以使用。

    然后,您可以将您在 git 别名中提到的命令(git log -1 --format=%cddate -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

    【讨论】:

    • 太棒了!它就像一个魅力,非常感谢你!我只是编辑了一点,只显示带有--date=short 的日期(没有时间),并删除了date -Is 中的's'。在每一行中添加一些内容是否容易,例如“自上次修改后的 15 天”基于当前和上次修改日期?
    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2019-02-26
    相关资源
    最近更新 更多