インストール - 差分ツール
概要
一般的なテキストファイルやソースコードファイルにおいて、ライタや開発者が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 --force |
ユーザに問い合わせずに処理を行う。
|
--posix | POSIX標準に従う。 例 : 差分を適用した結果空になったファイルを削除しない。 適用できなかった差分があった場合もファイルをバックアップしない。 |
差分の適用
元のファイルに差分を適用する。
patch <元のファイル> <差分ファイル>