45

私は少し変わった目的で git を使用しています。フィクションを書いているときにテキストを保存するためです。(わかってる、わかってる…オタク。)

私は生産性を追跡しようとしており、後続のコミット間の違いの程度を測定したいと考えています。作家の「仕事」の代用は、少なくとも作成段階では「書かれた言葉」です。文章の重要な部分である編集と圧縮を無視するため、単純な単語カウントは使用できません。私は追跡したいと思います:

 (words added)+(words removed)

これは二重にカウントされます (単語が変更されました) が、私はそれで問題ありません。

魔法の呪文を入力して、任意の 2 つのリビジョンについてこの距離メトリックを git に報告させるとよいでしょう。ただし、git diff はパッチであり、行の 1 文字だけをいじっただけでも行全体が表示されます。特に私の「行」は段落であるため、私はそれを望んでいません。理想的には、「単語」で何を意味するかを指定することもできます (ただし、\W+ はおそらく許容されます)。

単語ごとに差分を与えるための git-diff へのフラグはありますか? または、標準のコマンドライン ツールを使用して上記のメトリックを計算するソリューションはありますか?

4

9 に答える 9

14

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 gitwdd='git diff --word-diff=porcelain origin/master |grep -e"^+[^+]" -e"^-[^-]"|sed -e's/.//'|sort|uniq -d|wc -w|xargs'

alias gitw='echo $(($(gitwa) - $(gitwd)))'

gitwaandからの出力gitwdxargs trick を使用してトリミングされます。

マイルズの回答から追加された重複した単語。

于 2015-08-05T04:42:30.780 に答える
13

wdiffは単語ごとの比較を行います。Gitは、外部プログラムを使用して差分を実行するように構成できます。これらの2つの事実とこのブログ投稿に基づいて、以下はおおよそあなたが望むことをするはずです。

提供する不要な引数のほとんどを無視するスクリプトを作成し、git-diffそれらをに渡しますwdiff。以下を~/wdiff.pyまたは同様のものとして保存し、実行可能にします。

#!/usr/bin/python

import sys
import os

os.system('wdiff -s3 "%s" "%s"' % (sys.argv[2], sys.argv[5]))

それを使用するように伝えgitます。

git config --global diff.external ~/wdiff.py
git diff filename
于 2010-05-20T14:02:31.503 に答える
11

git diff --word-diffは、最新の安定バージョンのgit(git-scm.com)で動作します

必要な形式を決定するためのオプションがいくつかあります。デフォルトは非常に読みやすいですが、出力をスクリプトにフィードする場合は--word-diff=porcelainが必要になる場合があります。

于 2010-08-18T00:24:36.970 に答える
10

ここで他の回答の上に構築することにより、具体的な数値を取得する方法を見つけました。結果は概算ですが、追加または削除された文字数の有用な指標として十分に近いはずです。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

46664削除された文字 ( ) と追加された文字 ( )の違いは38741、現在のブランチで約7923文字が削除されたことを示しています。これらの個々の追加/削除数は、diff の+/-およびインデント文字のために膨張しますが、ほとんどの場合、その違いはその膨張のかなりの部分を相殺するはずです。

于 2015-01-28T02:41:37.630 に答える
4

Git には (長い間) の--color-wordsオプションがありましたgit diff。これはあなたのカウントを取得しませんが、差分を見ることができます.

scompt.com による wdiff の提案も優れています。別の差分を押し込むのは非常に簡単です ( git-difftoolを参照)。そこから、wdiff が本当に必要な結果を得ることができる出力から移動する必要があります。

git's what's cooks から、もう 1 つエキサイティングな情報を共有できます。

* tr/word-diff (2010-04-14) 1 commit
  (merged to 'next' on 2010-05-04 at d191b25)
 + diff: add --word-diff option that generalizes --color-words

word-diff を紹介するコミットは次のとおりです。おそらく、それはやがて next から master に移行し、git はこれをすべて内部的に行うことができるようになります - 独自の単語 diff 形式または wdiff に似たものを生成します。大胆な場合は、次から git をビルドするか、その 1 つのコミットをローカル マスターにマージしてビルドすることができます。

Jakub のコメントのおかげで: gitattributesに記載されている単語の正規表現 (構成パラメーター diff.*.wordRegex) を指定することで、必要に応じて単語の差分をさらにカスタマイズできます。

于 2010-05-20T14:28:13.787 に答える
4

私はStoutie答えが好きで、私が持っていたいくつかの単語数の質問に答えるためにもう少し設定可能にしたいと思っていました. ZSHで機能し、Bashで機能するはずの次のソリューションになりました。各関数は、現在の世界の状態を と比較するデフォルトで、任意のリビジョンまたはリビジョンの差origin/masterを取ります。


# Calculate writing word diff between revisions. Cribbed / modified from:
# https://stackoverflow.com/questions/2874318/quantifying-the-amount-of-change-in-a-git-diff
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)))
}

次に、次のように使用できます。


$ 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

これが誰かを助けることを願っています!

于 2016-08-13T20:30:14.580 に答える