Closed5

Gitのコード更新差分を簡単に取りたい

エセジニアエセジニア

お題:Gitのコード更新差分を簡単に取りたい

方法論 by Copilot

GitLab上でリポジトリのコード差分を計測するには、いくつかの方法があります。以下のツールやコマンドが特に有効です:

  1. git diff コマンド:
    基本的な差分を確認するために使用します。例えば、特定のコミット間の差分を確認するには、以下のようにします:
    git diff <commit1> <commit2>
    追加行数や削除行数を確認することができます。

    ⇒コマンド覚えるのだるい

  2. cloc ツール:
    コード行数を詳細に計測するためのツールです。空行数、コメント行数、論理LOC(実際のコード行数)を分類して計測できます1。
    コミット間の差分を計測するには、以下のコマンドを使用します:
    cloc --diff <commit1> <commit2>
    言語別に差分を出力することも可能です。

    ⇒有力

  3. GitLabのCode Quality機能:
    GitLabにはCode QualityやSAST(静的解析ツール)を使用して、コードの品質やセキュリティをチェックする機能があります2。
    .gitlab-ci.ymlファイルに設定を追加することで、自動的に差分を計測し、レポートを生成することができます。
    これらの方法を組み合わせることで、より詳細かつ正確なコード差分の計測が可能になります。どの方法が最適かは、プロジェクトの規模やニーズに応じて選択すると良いでしょう。

    ⇒ちょい違う。最終的にgitリポジトリ上のコード品質高めるのに良いが、コードカウンターじゃない

エセジニアエセジニア

clocツールのインストール

GitLab & Visual Studioへのインストール by Copilot

clocツールをGitLabやVisual Studioで動作させる方法について説明します。

GitLabでのclocの使用方法

  1. GitLab Runnerのセットアップ:
    まず、GitLab Runnerがインストールされていることを確認します。

  2. .gitlab-ci.ymlファイルの設定:
    clocを使用するために、以下のように.gitlab-ci.ymlファイルを設定します:

stages:
  - analyze

cloc:
  stage: analyze
  image: alpine:latest
  before_script:
    - apk add --no-cache cloc
  script:
    - cloc --diff <commit1> <commit2>
  artifacts:
    paths:
      - cloc-report.txt

これにより、指定したコミット間の差分を計測し、結果をcloc-report.txtに保存します。

⇒GitLab設定が絡むので、後で赤坂さんと相談

Visual Studioでのclocの使用方法

  1. clocのインストール:
    clocをインストールします。Windowsの場合、Chocolateyを使用して以下のコマンドでインストールできます:
    choco install cloc

    ⇒Chocolateyって、Win向けパッケージマネージャとしていいんだっけ?

  2. Visual Studioでの設定:
    Visual Studioでターミナルを開き、clocコマンドを実行します。例えば、プロジェクトディレクトリで以下のコマンドを実行します:
    cloc --diff <commit1> <commit2>
    コミット間の差分を計測し、結果を表示します。

    ⇒ここの見え方コマンドオプションは要調査

これらの手順を実行することで、GitLabやVisual Studioでclocを使用してコードの差分を計測することができます。何か他に質問があれば教えてくださいね!

エセジニアエセジニア

Win向けパッケージマネージャの選択

やっぱりChocolateyでなくScoopにする

参考になった判断基準
https://tech.guitarrapc.com/entry/2019/12/01/233522

Scoopインストール

Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')

# or shorter
iwr -useb get.scoop.sh | iex

Scoopで使えるツール

以下コマンドで一覧チェックできる
PS C:\Users\NA65719> scoop search

search結果一覧

Results from local buckets...

Name Version Source Binaries


1password-cli 2.30.0 main
7zip 24.08 main
7zip19.00-helper 19.00 main
ab 2.4.62 main
abc 1.0.0 main
ack 3.7.0 main
acmesharp 0.9.1.326 main
(後略)

Scoopの複数アプリケーションを纏めてパッケージインストール可能

Scoop は、アプリのダウンロード元に GitHub を利用しており これを Bucket と呼んでいます。 インストール直後は Main Bucketのみがインストールされています。
scoop bucket list

Bucket はscoop bucket addで追加できます。 Bucketを追加することで多くのアプリケーションをscoopでインストールできるようになります。 例えば、公式で提供されているExtra Bucket は、 Main Bucket にはないけどよく利用されるアプリケーションが含まれています。
scoop bucket add extras
extras Bucketの追加で gitkraken などもscoopでインストール可能になります。
scoop install gitkraken
インストールするときに、Bucket を気にしなくていいのでかなり楽です。

!注意点!

複数のパスに実行ファイルが存在することによる意図しない動作
グローバルパスに存在が期待されるソフトウェアの継続的な更新の困難さ

例えば、.NET Core SDK は Visual Studio でも入ったりし、あらゆるツールが利用しているため scoop でインストールすることは向きません。
⇒「何をscoopで入れて、何を入れない。」という選択を自分で行う必要がある

エセジニアエセジニア

WindowsでClocを使う(by Scoop & VisualStudio)

手順

  1. Scoopのインストール
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')

# or shorter
iwr -useb get.scoop.sh | iex
  1. Clocインストール
    scoop install cloc
  2. 計測対象のgitリポジトリのVisualStudioソリューションを開く (中身GitコマンドなのでVScodeも可)
  3. Visual Studioでの設定
    Visual Studioでターミナル(表示->ターミナル : Developer PowerShellウィンドウ)を開く
  4. Developer PowerShellウィンドウでclocコマンドを実行します。
    例えば、プロジェクトディレクトリで以下のコマンドを実行します:
    cloc --diff <commit1> <commit2>

コミット間の差分を計測し、結果を表示します。

注意:日本語ファイルがあるとエラーになる。。。らしい(未確認)

fatal: pathspec '"\343\201\273\343\201\222.md"' did not match any files
Failed to create tarfile of files from git. at C:\Users\Hoge\AppData\Local\npm-cache\_npx\193bf3c6a01f3d46\node_modules\.bin\..\cloc\lib\cloc line 5676.

以下を実施すれば解消する。
$ git config --local core.quotepath false

使用例

--helpを付与して実行すれば各オプションの説明が参照できる。
また、-vを付与すると実行内容の詳細が標準出力される。
そのほか、オプション挙動の確認結果事例サイト

https://qiita.com/yucca1/items/fe16e690d5855052c38e

抜粋

--include-ext=<ext1>[,ext2[...]]
指定した拡張子のファイルのみをカウント対象とする。拡張子の指定時、.(ドット)は不要である。

--exclude-ext=<ext1>[,<ext2>[...]]
指定した拡張子のファイルをカウント対象から除外する。拡張子の指定時、.(ドット)は不要である。

--exclude-list-file=<file>
<file>の中に記載したファイルやディレクトリをカウント対象から除外する。<file>のフォーマットは、--list-fileのインプットファイルと同じ。

--csv
csv形式で出力する。

--git
---diffオプション使用時のインプットは、デフォルトでは、まずファイルやアーカイブなどであるかを判定し、次にコミットハッシュなどgit関連のインプットと認識しようとする。このオプションを使用すると強制的に最初にgit関連のインプットとして認識しようとする。ブランチ名と同じディレクトリがある場合などに、ブランチ名として認識させたいときなどに使える。

--diff-timeout <N>
このオプションは、比較時の1ファイルあたりのタイムアウト値。デフォルトだと10秒。すなわち、比較に10秒以上かかる場合はその時点でタイムアウトし無視される。--diff-timeout 0にするとタイムアウトしない設定になる。

--count-and-diff <set1> <set2>
<set1>,<set2>に指定できるのは、ファイル、ディレクトリ、アーカイブのみで、git関連は指定不可。このオプションを指定すると、以下の流れで処理するようになる。
<set1>の行数カウント
<set2>の行数カウント
上記2つのカウント結果の差分計算

--diff-alignment=<file>
このオプションを使用すると、強制的に--diff状態で実行され、差分を計算する際に関連するファイルの情報を<file>の中に吐き出す。

--diff-list-file=<file>
比較するファイルのペアを<file>に記述し、それをもとに比較するように指示するオプション。<file>のフォーマットは、--diff-alignmentオプション使用時の出力結果と同じ。

--list-file=<file>
処理対象を<file>に記載して、それらだけをカウントするように指示するオプション。

--diff-list-files <file1> <file2>
<file1>,<file2>のフォーマットは、--list-fileのインプットファイルと同じ。
このオプションを指定すると、<file1>に記載したファイルやディレクトリと<file2>に記載したファイルやディレクトリを比較する。

--not-match-d='<directory1>|<directory2>'
特定のパスを除外することができます。
このコマンドは、<directory1>と<directory2>ディレクトリを除外してコード行数を計測します。
複数のディレクトリを除外する場合は、パイプ(|)で区切って指定します

エセジニアエセジニア

計測結果の見方

■各項目の説明
Language: プログラミング言語の種類。
files: 各言語のファイル数。
blank: 空行数。
comment: コメント行数。
code: 実際のコード行数(空行とコメント行を除いた行数)。

■差分の種類
same: 変更のなかった行数。
modified: 修正された行数。
added: 追加された行数。
removed: 削除された行数。

■差分の定義
変更された行:既存の行が変更された場合、その行は「修正された行」としてカウントされます。例えば、コードの一部が変更されたり、コメントが追加されたりした場合です。
追加された行:新しく追加された行は「追加された行」としてカウントされます。
削除された行:削除された行は「削除された行」としてカウントされます。

実例
github.com/AlDanial/cloc v 1.74  T=0.22 s (4.6 files/s, 4.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Python same                            0              0              0             24
       modified                        1              0              1             25
       added                           0             14              8            148
       removed                         0              0              0              1
JavaScript same                        0              0              0              9
       modified                        2              0              0             14
       added                           1              9             34             50
       removed                         0              0              0              0
-------------------------------------------------------------------------------
SUM: same                              0              0              0             33
       modified                        3              0              1             39
       added                           6             85            121            399
       removed                         0              0              0              1
-------------------------------------------------------------------------------
このスクラップは17日前にクローズされました