我使用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)
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)
输出gitwa和gitwd正在使用xargs的伎俩修剪.
Dav*_*dge 10
git diff --word-diff适用于最新稳定版的git(在git-scm.com)
有几个选项可以让你决定你想要它的格式,默认是可读的,但如果你将输出提供给脚本,你可能需要--word-diff = porcelain.
我找到了一种方法,通过建立在其他答案之上来获得具体数字.结果是近似值,但它应足够接近,以作为添加或删除的字符数量的有用指示.这是我的当前分支与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字符.由于差异+/ -和缩进字符,这些单独的添加/删除计数会膨胀,但是,在大多数情况下,差异应抵消该通货膨胀的很大一部分.
我喜欢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)
希望这对某人有帮助!
| 归档时间: |
|
| 查看次数: |
5024 次 |
| 最近记录: |