インストール - 差分ツール

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

一般的なテキストファイルやソースコードファイルにおいて、ライタや開発者が2つのファイルや同じファイルの2つのバージョンの違いを知りたい場合がある。
2つのファイルを比較する時、その内容の差はdiffと呼ばれる。


KDiff3

パッケージ管理システムからインストール

KDiff3をインストールする。

sudo zypper install kdiff3


ソースコードからインストール

KDiff3のGithubにアクセスして、KDiff3のソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf kdiff3-<バージョン>.tar.gz
cd kdiff3-<バージョン>


KDiff3のビルドに必要なライブラリをインストールする。

  • Qt 5.15.5以降 (Qt 5を使用する場合) / Qt 6.5以降 (Qt 6を使用する場合)
  • KDE Framework 5.86以降
  • GCC 9.0以降またはClang 10以降 (ただし、GCCを使用する場合は9.2以降が推奨される)
  • CMake 3.18以降
  • ECM 5.86以降
  • Boost 1.71以降


sudo zypper install cmake gcc11 gettext-runtime gettext-tools extra-cmake-modules                             \
                    ki18n-devel kcoreaddons-devel kiconthemes-devel kparts-devel kdoctools-devel kcrash-devel

# パッケージ管理システムからBoostをインストールする場合
sudo zypper install libboost_system1_75_0-devel libboost_headers1_75_0-devel

# Qt 5を使用する場合
sudo zypper install libqt5-qtbase-devel

# Qt 6を使用する場合
sudo zypper install qt6-base-devel


KDiff3のビルドディレクトリを作成する。

mkdir build && cd build


KDiff3をビルドおよびインストールする。

cmake -DCMAKE_C_COMPILER=<GCC 9.0以降のgccのパス> -DCMAKE_CXX_COMPILER=<GCC 9.0以降のg++のパス> \
      -DCMAKE_INSTALL_PREFIX=<KDiff3のインストールディレクトリ>       \
      -DCMAKE_BUILD_TYPE=Release                              \
      -DBOOST_ROOT=<Boostのインストールディレクトリ>                  \  # Boostのインストールディレクトリを指定する場合
      -DBoost_INCLUDE_DIRS=/<Boostのインストールディレクトリ>/include \  # Boostのインストールディレクトリを指定する場合
      -DBUILD_WITH_QT6=ON                                     \  # Qt 6を使用する場合
      ..

make -j $(nproc)
make install



Meld

パッケージ管理システムからインストール

sudo zypper install meld


インストールせずにソースコードから直接実行

Meldの公式WebサイトまたはMeldのGithubにアクセスして、Meldのソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf meld-<バージョン>.tar.gz
mv meld-<バージョン> meld
mv Meld  <Meldのインストールディレクトリ>


Meldを任意のディレクトリ(ホームディレクトリ等)にした場合は、~/.profileファイル等に環境変数PATHの設定を追記する。

vi ~/.profile


 # ~/.profileファイル
 
 export PATH="/<Meldのインストールディレクトリ>/bin:$PATH"


デスクトップエントリファイルを作成する。

vi ~/.local/share/applications/Meld.desktop


 # ~/.local/share/applications/Meld.desktopファイル
 
 [Desktop Entry]
 Type=Application
 Name=Meld
 GenericName=Diff Viewer
 Comment=Compare and merge your files
 Exec=/<Meldのインストールディレクトリ>/bin/meld %F
 Icon=org.gnome.Meld
 Terminal=false
 MimeType=application/x-meld-comparison;
 Categories=GTK;Development;
 Keywords=diff;merge;
 StartupNotify=true


ソースコードからインストール

Meldのビルドに必要な依存関係のライブラリをインストールする。

sudo zypper install glib2-devel gtk3 gtk3-devel python3 python3-devel python3-pycairo python3-pycairo-devel python3-gobject-cairo \
                    python3-gobject python3-gobject-devel python3-gobject-Gdk libgtksourceview-4-0 gtksourceview4-devel \
                    meson ninja gettext itstool libpango-1_0-0 wayland-devel wayland-protocols-devel


Meldの公式WebサイトまたはMeldのGithubにアクセスして、Meldのソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf meld-<バージョン>.tar.gz
cd meld-<バージョン>


Meldをビルドおよびインストールする。

meson build --prefix=<Meldのインストールディレクトリ>
ninja -C build
ninja -C build install

ninja -C build install update-po
# または
ninja -C build install meld-update-po


Meldを任意のディレクトリ(ホームディレクトリ等)にインストールした場合は、Meldの実行ファイルをラッピングするためのシェルを作成する。
これは、Meldの実行に必要なPythonモジュールのパスを指定する必要があるためである。

vi /<Meldのインストールディレクトリ>/bin/meld.sh


 # /<Meldのインストールディレクトリ>/bin/meld.shファイル
 
 #!/usr/bin/env sh
 
 appname="meld"
 
 # use -f to make the readlink path absolute
 dirname="$(dirname -- "$(readlink -f -- "${0}")" )"
 
 if [ "$dirname" = "." ]; then
    dirname="$PWD/$dirname"
 fi
 
 # Initialize interpreter path
 export PYTHONPATH="$dirname/../lib/python<Pythonのバージョン>/site-packages"
 export XDG_DATA_DIRS="$dirname/../share:$XDG_DATA_DIRS"
 
 # Run Meld binary
 "$dirname/$appname" "$@"


Meldの実行に必要な依存関係のパッケージをインストールする。

sudo zypper install python3 python3-pycairo python3-gobject python3-gobject-cairo  python3-gobject-Gdk \
                    libgtksourceview-4-0 typelib-1_0-GtkSource-4 gettext itstool libpango-1_0-0 


Meldを任意のディレクトリ(ホームディレクトリ等)にした場合は、~/.profileファイル等に環境変数PATHの設定を追記する。

vi ~/.profile


# ~/.profileファイル

export PATH="/<Meldのインストールディレクトリ>/bin:$PATH"


デスクトップエントリファイルを作成する。

vi ~/.local/share/applications/Meld.desktop


 # ~/.local/share/applications/Meld.desktopファイル
 
 [Desktop Entry]
 Type=Application
 Name=Meld
 GenericName=Diff Viewer
 Comment=Compare and merge your files
 Exec=/<Meldのインストールディレクトリ>/bin/meld.sh %F
 Icon=org.gnome.Meld
 Terminal=false
 MimeType=application/x-meld-comparison;
 Categories=GTK;Development;
 Keywords=diff;merge;
 StartupNotify=true


DolphinとMeldの連携

DolphinのコンテキストメニューにMeldを追加する。

vi ~/.local/share/kservices5/CompareMeld.desktop


 # ~/.local/share/kservices5/CompareMeld.desktopファイル
 
 [Desktop Entry]
 Type=Service
 ServiceTypes=KonqPopupMenu/Plugin
 Name=Compare using Meld
 TryExec=meld
 MimeType=inode/directory;application/octet-stream;
 Icon=/<Meldのアイコンがあるディレクトリ>/meld
 X-KDE-StartupNotify=false
 X-KDE-Priority=TopLevel
 X-KDE-Submenu=Compare using Meld
 Actions=setArg1;diff;diffsudo;_SEPARATOR_;selected;selectedsudo;
 
 [Desktop Action setArg1]
 Icon=/<Meldのアイコンがあるディレクトリ>/document-compareleft
 Exec=echo "%U" > /tmp/meld-menu-arg1
 Name=Mark for use in left column
 
 [Desktop Action diff]
 Icon=/<Meldのアイコンがあるディレクトリ>/document-compareright
 Exec=ARG1=$(cat /tmp/meld-menu-arg1);meld "$ARG1" %U; rm /tmp/meld-menu-arg1;
 Name=Use in right column and compare
 
 [Desktop Action diffsudo]
 Icon=/<Meldのアイコンがあるディレクトリ>/document-compareright
 Exec=ARG1=$(cat /tmp/meld-menu-arg1); rm /tmp/meld-menu-arg1; if [ "$XDG_SESSION_TYPE" = "wayland" ]; then xhost +si:localuser:root && pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY KDE_SESSION_VERSION=5 
 KDE_FULL_SESSION=true dbus-launch meld "$ARG1" %U && xhost -si:localuser:root; else pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true /<Meldのインストールディレクトリ>/meld "$ARG1" %U; fi;
 Name=Use in right column and compare as root
 
 [Desktop Action selected]
 Icon=/<Meldのアイコンがあるディレクトリ>/kr_comparedirs
 Exec=/<Meldのインストールディレクトリ>/meld %U; rm /tmp/meld-menu-arg1;
 Name=Compare selected (highlighted) files/folders
 
 [Desktop Action selectedsudo]
 Icon=/<Meldのアイコンがあるディレクトリ>/kr_comparedirs
 # Exec=sudo meld %U; rm /tmp/meld-menu-arg1;
 Exec=if [ "$XDG_SESSION_TYPE" = "wayland" ]; then xhost +si:localuser:root && pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true dbus-launch meld %U && \
      xhost -si:localuser:root; else pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true /<Meldのインストールディレクトリ>/meld %U; fi;
 Name=Compare selected (highlighted) files/folders as root



patchコマンドとdiffコマンド

patchコマンドとdiffコマンドとは

patchコマンドは、テキストファイルに差分を適用するコマンドである。
古いファイルと差分ファイルを基に、新しいファイルを作成する。

差分ファイルは、diffコマンドを実行して作成する。

patchコマンドの書式

patch <オプション> <元のファイル> <差分ファイル>
# または
patch -p<数字> < <差分ファイル>


例えば、patch -p1 < <差分ファイル>コマンドにおいて、
-p1オプションは、パッチ内のファイルパスから1つのディレクトリ要素を削除することを指定する。
これは、パッチファイルがソースツリーのルートディレクトリに対して相対的に作成されるためである。

patchコマンドの主なオプション

差分ファイル関連のオプション
オプション 説明
-i <ファイル名>
--input=<ファイル名>
差分を指定したファイルから読み取る。(デフォルトは標準入力)
-n
--normal
差分をdiffのデフォルト出力による差分として解釈する。
-c
--context
差分をdiff -cコマンドで出力した差分として解釈する。
-u
--unified
差分をdiff -uコマンドで出力した差分として解釈する。
-F <行数>
--fuzz=<行数>
diff -cコマンドに対し、適用する位置を探す際に無視できる行数を指定する。(デフォルトは2)
diff -cコマンドで出力した際の行数(デフォルトは3)より大きな数を指定しないよう注意する。
数字が大きい場合、間違った箇所に適用される場合が多くなる。
--binary 全てのファイルをバイナリモードで読み書きする。
diff -a --binaryコマンドで作成した差分を対象とする)
-e
--ed
差分をedスクリプトとして解釈する。
-D <プリプロセッサ名>
--ifdef=<プリプロセッサ名>
差分を#ifdef "<プリプロセッサ名>" #endif形式で適用する。


差分適用時の処理に関連するオプション
オプション 説明
-d <ディレクトリのパス> --directory=<ディレクトリのパス> 指定したディレクトリへ移動した後に他の処理を行う。
-p <個数>
--strip=<個数>
差分に記載されたファイル名から指定した個数分のパス指定を取り除く。
-R
--reverse
新旧のファイルが反転していると見なす。
-N
--forward
反転していると思われる差分や適用済みと思われる差分を無視する。
-l
--ignore-whitespace
空白の個数の違いや行末の空白の有無による違いを無視する。
-E
--remove-empty-files
差分を適用した結果が空になったファイルを削除する。
-o <ファイル名>
--output=<ファイル名>
指定した名前のファイルに出力する(デフォルトは同名のファイルで置き換える。
-r <ファイル名>
--reject-file=<ファイル名>
適用できなかった差分(リジェクト)を出力するファイル名を指定する。
未指定の場合は、元のファイル名.rejファイルに出力する。
-Z
--set-utc
差分の適用で内容が書き換わった場合、
適用後のファイルの変更日時とアクセス日時を
コンテキスト差分ファイルのヘッダに書かれているタイムスタンプに設定する。
(時刻はUTCであるものと見なす)
-T
--set-time
差分の適用で内容が書き換わった場合、
適用後のファイルの変更日時とアクセス日時を
コンテキスト差分ファイルのヘッダに書かれているタイムスタンプに設定する。
(ヘッダはローカルの時刻を使っていると見なすため、非推奨)
--quoting-style=<スタイル> ファイル名を出力するスタイルを以下から指定する。
デフォルトは、環境変数QUOTING_STYLEで指定可能である。
未指定の場合はshellとなる。

literal : ファイル名をそのまま出力する。
shell : 必要に応じて、シェル用の引用符を付けて出力する。
shell-always : 常にシェル用の引用符を付けて出力する。
c : C言語文字列と同様な引用符を付けて出力する。
escape : cと同様に引用符を付ける。ただし、最初と最後の二重引用符は省略する。


バックアップに関連するオプション
オプション 説明
-b
--backup
バックアップファイルを作成する。
(バックアップファイル名を決める場合は、-Vオプションで指定する)
--backup-if-mismatch 適用できない差分があり、かつ、バックアップが指定されていない場合、ファイルをバックアップする。
(POSIXに準拠していない場合のデフォルト)
--no-backup-if-mismatch 適用できない差分があり、かつ、バックアップが指定されていないファイルは、バックアップしない。
(POSIX準拠時のデフォルト)
-V <命名法>
--version-control=<命名法>
バックアップファイル名を決定する方法を以下から指定する。
デフォルトは環境変数PATCH_VERSION_CONTROLまたはVERSION_CONTROLで指定できる。
未指定の場合は、existingとなる。

existing または nil
番号付きのバックアップがある場合はバックアップに番号を付加するが、無い場合は簡易バックアップを作成する。

numbered または t
バックアップに番号を付加する。(例 : file.txtの場合、file.txt.~1~のようになる)

simple または never
簡易バックアップ(ファイル名は、-B-Y-zのいずれかで指定する。
未指定の場合は、環境変数SIMPLE_BACKUP_SUFFIXを指定する。
いずれも指定していない場合は、ファイル名の末尾に.origを付ける)
-B <文字列>
--prefix=<文字列>
簡易バックアップファイル名で、元のファイル名の前に文字列を付ける。

例 : -B /junk/と指定する場合、src/file.cファイルのバックアップは/junk/src/file.cとなる。
-Y <文字列>
--basename-prefix=<文字列>
簡易バックアップファイル名で、ファイル名のベース名に文字列を付ける。

例 : -Y .del/と指定する場合、src/file.cファイルのバックアップはsrc/.del/file.cとなる。
-z <文字列>
--suffix=<文字列>
簡易バックアップファイル名で、元のファイルの末尾に文字列を付ける。

例 :
-z ~と指定する場合、src/file.cのバックアップはsrc/file.c~となる。
これは、環境変数SIMPLE_BACKUP_SUFFIXでも指定可能である。


全体的な動作に関連するオプション
オプション 説明
--dry-run 差分を当てた場合の結果を表示する。(実際には、ファイルの変更を行わない)
-s
--silent
--quiet
エラーメッセージ以外は出力しない。
--verbose 処理中の情報を出力する。
-t
--batch
ユーザに問い合わせずに処理を行う。

  • ヘッダにファイル名を含まない差分ファイルはスキップする。(-fオプションと同様)
  • ファイルのバージョンが差分中のPrereq:の行に記述されたバージョンと異なる場合でも差分を適用して、差分が反転しているように見える場合は反転していると見なす。
-f
--force
ユーザに問い合わせずに処理を行う。

  • ヘッダにファイル名を含まない差分ファイルはスキップする。(-tオプションと同様)
  • ファイルのバージョンが差分中のPrereq:の行に記述されたバージョンと異なる場合でも差分を適用して、差分が反転しているように見えても反転していないと見なす。
  • -Tオプション、-Zオプション指定時において、ファイルの内容が書き換わらない場合もタイムスタンプを強制的に変更する。
--posix POSIX標準に従う。

例 :
差分を適用した結果空になったファイルを削除しない。
適用できなかった差分があった場合もファイルをバックアップしない。


差分の適用

元のファイルに差分を適用する。

patch <元のファイル> <差分ファイル>