git diff
またはgit log -p
、ソースファイルの行番号を出力とインラインで取得するにはどうすればよいですか?
調べてみたman git-diff | grep "line numbers"
と私はグーグルで試しましたが、すぐに何も得られませんでした。
git diff
では人間が読める行番号を取得できません現在、git diff
の横に行番号を垂直に表示するオプションはありません。
その情報は、差分の変更ごとに(c)hunkヘッダーで利用できますが、それは nified-diff形式 にあります:
@@ -start,count +start,count @@
ファイルの元の状態は-
で表され、新しい状態は+
で表されます(ハンクヘッダーの追加と削除を意味しません。start
は開始を表しますファイルの各バージョンの行番号。count
は、開始点から始まる行数を表します。
diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
[color "branch"]
upstream = cyan
[color "diff"]
- meta = yellow
+ meta = cyan
plain = white dim
old = red bold
new = green bold
ハンクヘッダー
@@ -11,7 +11,7 @@
ファイルの以前のバージョンは11行目から始まり、7行含まれていることを示しています。
11 [color "branch"]
12 upstream = cyan
13 [color "diff"]
14 - meta = yellow
14 + meta = cyan
15 plain = white dim
16 old = red bold
17 new = green bold
ファイルの次のバージョンも11行目で始まり、7行も含まれています。
おそらくおわかりのように、unified-diff形式では(少なくともマシンではない場合)行番号を簡単に把握できません。読み込める行番号が本当に必要な場合は、それらを表示する差分ツールを使用する必要があります。
Andy Talkowskiのコードを拡張した、さらに2つのソリューションがあります。
プレーンテキスト:
git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
/^(---|\+\+\+|[^-+ ])/{print;next};\
{line=substr($0,2)};\
/^-/{print "-" left++ ":" line;next};\
/^[+]/{print "+" right++ ":" line;next};\
{print "(" left++ "," right++ "):"line}'
\033[66m
がカラーコードの形式であると仮定した場合の色付きテキスト:
git diff --color=always | \
gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
{line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
bare~/^-/{print "-"left++ ":" line;next};\
bare~/^[+]/{print "+"right++ ":" line;next};\
{print "("left++","right++"):"line;next}'
コードは、-
または+
で始まる行を-1:-
または+1:+
に変更し、(5,6):
で始まる行を変更します。番号は、それぞれのファイルの行番号です。
これを修正しようとするスクリプトがあります-怒りでテストされていませんが、大丈夫のようです。 git diffが生成し、awkを使用して行カウントを維持するレコードに依存します。
# Massage the @@ counts so they are usable
function prep1() {
cat | awk -F',' 'BEGIN { convert = 0; }
/^@@ / { convert=1; }
/^/ { if ( convert == 1 ) { print $1,$2,$3;
} else { print $0;
}
convert=0;
}'
}
# Extract all new changes added with the line count
function prep2() {
cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
/^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line; }
/^[-]/ { left++; display=left; inc=0; }
/^[+]/ { line++; display=line; inc=0; }
/^[-+][-+][-+] / { out=0; inc=0; }
/^/ {
line += inc;
left += inc;
display += inc;
if ( out == 1 ) {
print display,$0;
} else {
print $0;
}
out = 1;
inc = 1;
display = line;
}'
}
git diff $1 | prep1 | prep2
あなたが試すことができます
git blame
ファイルに。ファイルの各行のコミッター、コミットID、行番号が表示されます。
簡単な方法は、git diff -U0
を使用することです。これにより、コンテキストの行が0に設定され、@@値が実際に変更された行と一致するようになります。デフォルトでは、@@の値には3行の前後のコンテキストが含まれますが、これは人間には不便です。
例:
git diff # default
@@ -10,8 +10,8 @@
行10はbeforeコンテキストの最初の行を参照するため、これは変更された行の行番号を計算するのが困難です。最初に変更された行の実際の行番号は10 + 3 = 13です。変更された行の数を計算するには、前後のコンテキストも減算する必要があります:8-3-3 = 2。
git diff -U0
@@ -13,2 +13,2 @@
ご覧のとおり、context = 0に設定すると、@@値が人間にとって読みやすくなります。変更された行は13行目から始まり、2行変更されていることがわかります。
これは、各ブロックの行番号のみを表示するため、完全ではありません。すべての行の行番号を表示する場合は、外部エディターにdifftoolを使用します。 https://stackoverflow.com/a/50049752 を参照してください
Difftoolとしてgit difftool
をmeldとともに使用するのが好きです。 git diff
よりも見やすく、GUIを横に並べて見やすく、行番号を表示します。
git difftool
を使用して、行番号を表示する外部エディターでdiffを実行できます。 vim/vimdiffでこれを行う方法は次のとおりです。
Vimdiffをgitのdifftoolとして設定します。
git config --global diff.tool vimdiff
Vimdiffを使用するときに自動的に行番号を表示するように~/.vimrc
を構成します。
if &diff
set number
endif
行番号でvimdiffを使用するgit difftoolを実行します。
git difftool
いつでも猫を使用できます。欠点は、色が失われることです。
例:
git diff yourfile.cpp | cat -n