【问题标题】:Git: Getting total numbers of uncomitted lines in a repoGit:获取回购中未提交行的总数
【发布时间】:2017-09-27 19:12:39
【问题描述】:

是否有命令获取当前 git 存储库中更改的 总数。我想计算考虑暂存和未暂存文件。

这是我能得到的最接近的

$ git diff --cached --shortstat
 1 file changed, 1 insertion(+), 1 deletion(-)

$ git diff --shortstat
 1 file changed, 1 insertion(+)

但我必须执行两个命令,然后解析(很容易出错,你永远不知道所有情况)结果以查找已更改的 数量。

如果不是 git 命令,也可以使用 bash/zsh 函数。

更新:

所以这个想法是在我的 ZSH 提示符上跟踪总未提交的行(显示 git 工作目录的大致肮脏程度),类似于:

[~/dotfiles] (master) ✗ [192]
$ ...

感谢@arco444 的回答,我稍作修改,我现在有了关注,如果有人想要达到同样的效果

function git_change_count {
    local IS_INSIDE_REPO=$(git rev-parse --is-inside-work-tree 2>/dev/null)
    if [[ $IS_INSIDE_REPO == "true" ]]; then
        { git diff --cached --numstat; git diff --numstat; } | awk '{ a+=($1+$2) } END {print a}'
    fi
}

我正在添加添加和删除的行,而不是获取它们的差异。这实质上意味着已编辑的行显示为 2,但这样做涵盖了添加和删除两条不同的行并且由于减法我们得到 0 作为结果的情况。

【问题讨论】:

  • 这两个命令将重复计算在两个位置发生变化的行。这对我来说似乎是一件奇怪的事情。这里的最终目标是什么?
  • @EtanReisner 这个想法是捕获给定 git 工作目录的“脏”。它不必是精确的。如果在非暂存版本中再次更改,如果已暂存的行被计算两次,我没关系。
  • @kunal 我喜欢这个,你是如何添加显示在提示顶行的功能?
  • @Ziv 只需调用提示变量中的函数,如PROMPT='....$(git_change_count)...'PROMPT 字符串中的新行将被保留,因此您会在提示符下获得新行。

标签: git bash zsh


【解决方案1】:

怎么样:

{ git diff --cached --numstat; git diff --numstat; } | awk '{ a+=($1-$2) } END {print a}'

--numstat 标志为您提供:

#added #deleted #filename

您需要对暂存文件和未暂存文件都运行它,然后通过管道传送到awk 以进行算术运算。它将返回添加和删除行的总和,因此如果删除的行多于添加的行,您将得到否定结果。

【讨论】:

    【解决方案2】:

    试试这个:

    git diff --numstat |  cut -d$'\t' -f 1 | paste -sd+ - | bc
    

    这里的git diff --numstat 提供了每个文件的加法和减法数(由制表符分隔)。 cut 命令按选项卡拆分字段,选择第一个字段(添加)。 paste 命令从数字列创建一个加法,bc 命令执行求和。以上为补充。您可以通过将-f 1 替换为-f 2 来进行减法。如果你想要加减法,试试:

    git diff --numstat |  cut -d$'\t' -f 1,2 | tr '\t' '+' | paste -sd+ -  | bc
    

    在使用paste之前只使用tr在每一行插入加号

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2021-10-23
      • 2016-08-20
      • 1970-01-01
      相关资源
      最近更新 更多