量化git diff的变化量?

Ale*_*man 32 git word-count

我使用git有一个不寻常的目的 - 它在我写小说时存储我的文本.(我知道,我知道......太讨厌了.)

我试图跟踪生产力,并希望衡量后续提交之间的差异程度.作者对"工作"的代理是"写字",至少在创作阶段.我不能使用直字数,因为它忽略了编辑和压缩,这两者都是写作的重要部分.我想要跟踪:

 (words added)+(words removed)
Run Code Online (Sandbox Code Playgroud)

这将重复计算(单词改变),但我没关系.

键入一些神奇的咒语并让git报告任何两个修订版本的距离度量标准会很棒.但是,git diffs是补丁,即使你只是在线上捣乱了一个字符,也会显示整行.我不希望这样,特别是因为我的"行"是段落.理想情况下,我甚至可以用"单词"来指定我的意思(虽然\ W +可能是可以接受的).

是否有一个git-diff的标志,以逐字的方式给出差异?或者,是否有使用标准命令行工具来计算上述指标的解决方案?

Edw*_*ale 11

wdiff逐字逐句比较.可以将Git配置为使用外部程序进行差异.根据这两个事实和本博文,以下内容应该大致按照您的意愿行事.

创建一个脚本以忽略git-diff提供并传递给它们的大多数不必要的参数wdiff.将以下内容保存为~/wdiff.py类似内容并使其可执行.

#!/usr/bin/python

import sys
import os

os.system('wdiff -s3 "%s" "%s"' % (sys.argv[2], sys.argv[5]))
Run Code Online (Sandbox Code Playgroud)

告诉git使用它.

git config --global diff.external ~/wdiff.py
git diff filename
Run Code Online (Sandbox Code Playgroud)

  • 在有`git diff --word-diff`之前,这是一个很好的答案 (2认同)
  • 现在有了 `git difftool` 不再需要永久修改 git 的 `diff` 输出,你可以定义任意数量的自定义 diff 命令,当然你可以给它们别名。见 /sf/answers/2859486171/ (2认同)

Sto*_*tie 11

基于James'和cornmacrelf的输入,我添加了算术扩展,并提出了一些可重用的别名命令来计算git diff中的单词:

alias gitwa='git diff --word-diff=porcelain origin/master | grep -e "^+[^+]" | wc -w | xargs'
alias gitwd='git diff --word-diff=porcelain origin/master | grep -e "^-[^-]" | wc -w | xargs'
alias gitw='echo $(($(gitwa) - $(gitwd)))'
Run Code Online (Sandbox Code Playgroud)

输出gitwagitwd正在使用xargs的伎俩修剪.


Dav*_*dge 10

git diff --word-diff适用于最新稳定版的git(在git-scm.com)

有几个选项可以让你决定你想要它的格式,默认是可读的,但如果你将输出提供给脚本,你可能需要--word-diff = porcelain.


Jam*_*ald 8

我找到了一种方法,通过建立在其他答案之上来获得具体数字.结果是近似值,但它应足够接近,以作为添加或删除的字符数量的有用指示.这是我的当前分支与origin/master相比的示例:

$ git diff --word-diff=porcelain origin/master | grep -e '^+[^+]' | wc -m
38741
$ git diff --word-diff=porcelain origin/master | grep -e '^-[^-]' | wc -m
46664
Run Code Online (Sandbox Code Playgroud)

删除的字符(46664)和添加的字符(38741)之间的差异表明我当前的分支已删除了大约7923字符.由于差异+/ -和缩进字符,这些单独的添加/删除计数会膨胀,但是,在大多数情况下,差异应抵消该通货膨胀的很大一部分.

  • 为什么不一直走下去回答原来的问题呢?`wc -w`会找到字数.更有用. (5认同)

Ant*_*zzo 5

我喜欢Stoutie答案,并希望使其更具可配置性,以回答我遇到的一些字数统计问题。最终得到了以下可以在 ZSH 中运行并且应该在 Bash 中运行的解决方案。每个函数都会接受任何修订或修订差异,默认情况下将世界的当前状态与origin/master


# Calculate writing word diff between revisions. Cribbed / modified from:
# /sf/ask/201202291/
function git_words_added {
  revision=${1:-origin/master}

  git diff --word-diff=porcelain $revision | \
    grep -e "^+[^+]" | \
    wc -w | \
    xargs
}

function git_words_removed {
  revision=${1:-origin/master}

  git diff --word-diff=porcelain $revision | \
    grep -e "^-[^-]" | \
    wc -w | \
    xargs
}

function git_words_diff {
  revision=${1:-origin/master}

  echo $(($(git_words_added $1) - $(git_words_removed $1)))
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:


$ git_words_added
# => how many words were added since origin/master

$ git_words_removed
# => how many words were removed since origin/master

$ git_words_diff
# => difference of adds and removes since origin/master (net words)

$ git_words_diff HEAD
# => net words since you last committed

$ git_words_diff master@{yesterday}
# => net words written today!

$ git_words_diff HEAD^..HEAD
# => net words in the last commit

$ git_words_diff ABC123..DEF456
# => net words between two arbitrary commits
Run Code Online (Sandbox Code Playgroud)

希望这对某人有帮助!