11

で設定*.py diff=pythonしました.git/info/attributes。したがって、Gitは関数の境界がどこにあるかを知っています。git diff -Wは、関数全体が表示されていることを確認することもできます。

しかし、git diffの出力を特定の関数だけ(または複数)に制限する方法はありますか?

(それが失敗した場合、それはひどいことだと思います...)

編集これは次の場合にも役立ちます:views.pyを変更するすべてのコミットを表示しないでください。その中の特定の関数を変更するコミットを表示してくださいgit loggit rev-list(はい、理想的な世界では、views.pyは8人の異なる開発者によって頻繁に変更される2000行の巨大なものではありません...)

4

2 に答える 2

2

OK、 Bireiのおかげで解決策が見つかりました。

その回答の awk スクリプトを、少しの bash と組み合わせて使用​​します。

~/scripts/grit:

#!/bin/bash
cmd=$1
shift 1
if [ "$cmd" = "" ]; then
  git
# other commands not relevant to this question go here
elif [ $cmd = "funcdiff" ]; then
  git show "$1:$3" | awk -f ~/scripts/getfunc.awk -v f=$4 > /tmp/.tmp1
  git show "$2:$3" | awk -f ~/scripts/getfunc.awk -v f=$4 > /tmp/.tmp2
  git diff -W --no-index /tmp/.tmp1 /tmp/.tmp2 

else
  git $cmd $@
fi

使用例:grit funcdiff 009e75 8b7a14 ./staging.py write_uploaded

これは ~/.gitconfig に git エイリアスとして追加することもできます

于 2012-05-09T10:42:24.873 に答える
1

diff出力を単一の関数に制限できる他のオプション(--function-contextまたはその短いオプション以外)は見つかりませんでした。-W

そして、このブログ投稿-Wに示されているように、「関数」が言語によって大きく異なる可能性があることを知っているため、そのオプションでさえ常に十分であるとは限りません。

少なくとも大規模な PHP クラス内では、このオプションはかなり信頼できないことがわかりました。
私のテスト--function-contextでは、元のファイルのほとんどすべてが表示されることが多く、git は PHP の関数境界を認識していないように見えます。
変更前後のコンテキスト行の数はランダムに見えます。また、diff は必ずしも関数のすべての行を表示するとは限りません。

この変更を導入した元のパッチ メッセージは、いくつかの光を当てています。

この実装には、grep のものと同じ欠点があります。つまり、関数の終わりを明示的に見つける方法がないということです。
つまり、次の認識された関数が開始されるまで、数行の余分なコンテキストが表示されます。

そのため、関数の境界を検出することは git では難しいようです。
この例では、git は関数境界を検出せず、ファイル全体のコンテキストを提供しているようです。


OP Steve Bennettが指摘しているように、潜在的な解決策は、これら2つの「一時」ファイルを比較するために、変更前後のリビジョンで関数を抽出するgitエイリアスを定義することです。「 Git エイリアスの作成」および「ファイルから単一の Python 関数を選択する Bash スクリプト
」の 例。

これは、OP がレポでたまたま使用する特定のタイプのソースを解析できるアドホック ソリューションです。

于 2012-05-09T08:29:03.447 に答える