Gitコマンド入門::さまざまなツール(Git Grep)第八十二回

5 min read読了の目安(約4800字

みなさんこんにちは! 今回からは、Gitのツール関連を学習して行きますね。まだ、実際に使いこなしていない私ですが、まあ~開発経験だけは30年もあり、いっちょまえかな?(^▽^;) 今もコツコツやっていますので、それなりに、ツボは抑えているつもりですよ!
ということで、今回は検索コマンド、grep です!

今日の学習は、こちら!

https://git-scm.com/book/ja/v2/Git-のさまざまなツール-検索
7.5 Git のさまざまなツール - 検索

前回の記事はこちらから!

https://zenn.dev/shiozumi/articles/98073c09c9889b

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

いつも環境構築から!

$ mkdir func0082 && cd $_

$ git init
Initialized empty Git repository in /home/shiozumi/mygit/func0082/.git/

$ git add sample.php

$ git commit -m "1st"

[shiozumi@ovs-009 func0082]$ git log -p
commit 3bee1de60686ed73f8ada35bfe474257edfcfcf6 (HEAD -> master)
Author: Makoto Shiozumi <shiozumi@esmile-hd.jp>
Date:   Wed Apr 14 10:54:05 2021 +0900

    1st

diff --git a/sample.php b/sample.php
new file mode 100755
index 0000000..1ad19ae
--- /dev/null
+++ b/sample.php
@@ -0,0 +1,35 @@
+<?php
+
+$filename = tempnam('/tmp', 'zlibtest') . '.gz';
+echo "<html>\n<head></head>\n<body>\n<pre>\n";
+$s = "Only a test, test, test, test, test, test, test, test!\n";
+
+// 最大限の圧縮を指定して書きこみ用にファイルをオープン
+$zp = gzopen($filename, "w9");
+
+// 文字列をファイルに書きこむ
+gzwrite($zp, $s);
+
+// ファイルを閉じる
+gzclose($zp);
+
+// 読みこみ用にファイルをオープン
+$zp = gzopen($filename, "r");
+
+// 3 文字読みこむ
+echo gzread($zp, 3);
+
+// ファイルの終端まで出力して閉じる
+gzpassthru($zp);
+gzclose($zp);
+
+echo "\n";
+
+// ファイルをオープンし、内容を出力する (2回目)
+if (readgzfile($filename) != strlen($s)) {
+        echo "Error with zlib functions!";
+}
+unlink($filename);
+echo "</pre>\n</body>\n</html>\n";
+
+?>

sample.php は、こちらです!

https://gist.github.com/3f0e1e7b37b152691e1f8587094716fa.git

git grep -n 'echo' sample.php

$ git grep -n 'echo' sample.php
sample.php:4:echo "<html>\n<head></head>\n<body>\n<pre>\n";
sample.php:20:echo gzread($zp, 3);
sample.php:26:echo "\n";
sample.php:30:        echo "Error with zlib functions!";
sample.php:33:echo "</pre>\n</body>\n</html>\n";
  1. -n は、ファイルの行番号を出力
  2. 'echo' は、文字列の指定
  3. sample.php は、ターゲットのファイルです。

では、test.php も追加します!

$ git add test.php
$ git commit -m "2nd"

$ git log -p -1
commit 3071fcb63f49b0c2ec8bf1670b50d6c750281d7a (HEAD -> master)
Author: Makoto Shiozumi <shiozumi@esmile-hd.jp>
Date:   Wed Apr 14 11:05:20 2021 +0900

    2nd

diff --git a/test.php b/test.php
new file mode 100755
index 0000000..0247e92
--- /dev/null
+++ b/test.php
@@ -0,0 +1,16 @@
+<?php
+
+$zip = new ZipArchive();
+$filename = "./test112.zip";
+
+if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
+    exit("cannot open <$filename>\n");
+}
+
+$zip->addFromString("testfilephp.txt" . time(), "#1 This is a test string added as testfilephp.txt.\n");
+$zip->addFromString("testfilephp2.txt" . time(), "#2 This is a test string added as testfilephp2.txt.\n");
+$zip->addFile($thisdir . "/too.php","/testfromfile.php");
+echo "numfiles: " . $zip->numFiles . "\n";
+echo "status:" . $zip->status . "\n";
+$zip->close();
+?>

test.php は、こちらです!

https://gist.github.com/8e27954568c64b7321fc67a9bf0b48d6.git

勿論、git clone もこちらから可能です!

$ git clone https://github.com/shiozumi-esmile/20210414.git

// ファルダーが新規作成されます!
$ cd 20210414

git grep -n 'echo' test.php

$ git grep -n 'echo' test.php
test.php:13:echo "numfiles: " . $zip->numFiles . "\n";
test.php:14:echo "status:" . $zip->status . "\n";

git grep -n 'echo' sample.php test.php

sample.php:4:echo "<html>\n<head></head>\n<body>\n<pre>\n";
sample.php:20:echo gzread($zp, 3);
sample.php:26:echo "\n";
sample.php:30:        echo "Error with zlib functions!";
sample.php:33:echo "</pre>\n</body>\n</html>\n";
test.php:13:echo "numfiles: " . $zip->numFiles . "\n";
test.php:14:echo "status:" . $zip->status . "\n";

ファイル名を2つ羅列してみました! 勿論、ワイルドカード、*.php でもOK!

git grep -n '</.*>' sample.php 正規表現もOK!

$ git grep -n '</.*>' sample.php
sample.php:4:echo "<html>\n<head></head>\n<body>\n<pre>\n";
sample.php:33:echo "</pre>\n</body>\n</html>\n";

git grep --count 'echo' カウント数の表示

$  git grep --count 'echo'
sample.php:5
test.php:2
// echo 文字列にヒットした回数が、それぞれ、5回、2回

git grep -n -e '$zp' --and \( -e 'close' -e 'file' \)

$ git grep -n -e '$zp' --and \( -e 'close' -e 'file' \)

sample.php:8:$zp = gzopen($filename, "w9");
sample.php:14:gzclose($zp);
sample.php:17:$zp = gzopen($filename, "r");
sample.php:24:gzclose($zp);

$zp に加えて、 close か、file の文字列がある行がヒットします!

--and の他、--or なども指定できますね。ちょっと複雑になっていますが、みなさん各自で、いろいろお試しください!

まとめ

今回は、さくっと、かる~い感じで学習しましたけど、いろいろやり始めると、かなり時間も掛かりそうですね。Git本家のドキュメントには、作業ディレクトリだけでなくコミット済みの全ツリーにもということですから、どちらかというと、現在のファイルよりも、過去ファイルの状態に対して、grep 検索するケースのメリットの方が、大きそうですね。

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/ad3f3f50393e11
https://twitter.com/esmile2013