Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git:获取回购协议中未注释行的总数_Git_Bash_Zsh - Fatal编程技术网

Git:获取回购协议中未注释行的总数

Git:获取回购协议中未注释行的总数,git,bash,zsh,Git,Bash,Zsh,是否有一个命令来获取当前git repo中更改的行的总数。我想对暂存和未暂存的文件进行计数 这是我能得到的最接近的 $ git diff --cached --shortstat 1 file changed, 1 insertion(+), 1 deletion(-) $ git diff --shortstat 1 file changed, 1 insertion(+) 但我必须执行两个命令,然后解析(非常容易出错,您永远不知道所有情况)结果,以找到已更改的行数 如果不是git命令

是否有一个命令来获取当前git repo中更改的行的总数。我想对暂存和未暂存的文件进行计数

这是我能得到的最接近的

$ 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。

尝试以下操作:

git diff --numstat |  cut -d$'\t' -f 1 | paste -sd+ - | bc
这里的
git diff--numstat
为每个文件提供了添加和删除的数量(由制表符分隔)。
cut
命令按选项卡拆分字段,选择第一个字段(添加项)。
paste
命令从数字列创建一个加法,而
bc
命令执行求和。以上内容仅供补充。您可以通过将
-f1
替换为
-f2
来执行减法。如果需要加减法,请尝试:

git diff --numstat |  cut -d$'\t' -f 1,2 | tr '\t' '+' | paste -sd+ -  | bc
在使用粘贴之前,只需使用
tr
在每行插入附加符号,如何:

{ git diff --cached --numstat; git diff --numstat; } | awk '{ a+=($1-$2) } END {print a}'
--numstat
标志为您提供:

#added #deleted #filename

您需要对暂存和未暂存的文件都运行它,然后通过管道连接到
awk
来执行该算法。它将返回添加的行和删除的行的总和,因此,如果删除的行多于添加的行,则将得到一个负结果。

这两个命令将加倍计算两个位置中已更改的行数。这对我来说似乎是件奇怪的事。这里的最终目标是什么?@EtanReisner的想法是捕获给定git工作目录的“脏”。它不一定要精确。如果在未老化版本中再次更改暂存的行,则该行被计数两次,我没问题。@kunal我喜欢这样,您是如何添加要在提示符顶行中显示的函数的?@Ziv只需在提示符变量中调用该函数,如
prompt='..$(git_change_count)..
PROMPT
string中的新行将被保留,因此您将在PROMPT中获得新行。