patch開発元GNUプロジェクト
最新版2.7 / 2012年9月12日 (11年前) (2012-09-12)
リポジトリ
git.savannah.gnu.org/git/patch.git
patch(パッチ)は、テキストファイルにパッチ処理を行うUNIX上のプログラム。「パッチファイル」と呼ばれるファイルに格納された命令群に従ってテキストファイルを更新する。パッチファイル(単にパッチとも呼ばれる)自体もテキストファイルであり、diff を使って元のファイルと更新後のファイルの差分をとることで作成される。パッチによるファイルの更新を「パッチを当てる」などという。 patch を最初に作ったのは(後に Perl を開発した)ラリー・ウォールであり、彼はそれを1985年5月に ⇒mod.sources へポストした(後に comp.sources.unix となった)。このプログラムはGNUプロジェクトの一部となり、フリーソフトウェア財団が保守している。 patchはプログラマの間でのやり取りのために作られ、ソースコードの更新のためによく用いられている。そのため、パッチソフトと言えばプログラムに使うものという先入観がある人が多いが、実際にはあらゆるテキストに適用可能である。パッチソフトは「当て布」という本来の語義に反して、テキストの追加のみでなく削除も行うことができる。なおpatchは、バイナリ形式のパッチを扱うプログラムではない。 patch への入力となる diff ファイルは読み取り可能なテキストファイルであり、使う前に人間が中身を確かめることが容易である。より進んだ diff を使った場合、パッチ適用前に独自に修正されたファイルにもパッチを適用可能である(それらの修正が patch を妨げない限り)。これは例えばコンテキスト形式 (diff -c) やユニファイド形式 (diff -u) を使う場合である。これらの diff は変更箇所の前後の文脈(コンテキスト)も diff の一部として示す。patch はそれらの情報を使って、行番号がずれていてもパターンマッチングによってパッチ適用箇所を特定する(もちろん、最初は行番号を使ってパッチを適用しようと試みる)。 コンテキスト形式やユニファイド形式は行番号に依存しないのでパッチに適している。ユニファイド形式は慣れていないと読みにくく、コンテキスト形式の方が分かりやすい。ただし、ユニファイド形式の方が非常にコンパクトになる。また、多くのオープンソースプロジェクトは「diff -u 変更前ファイル 変更後ファイル」で生成されたユニファイド形式のパッチを推奨している。 diff プログラム以外にも diff 形式のファイルを生成するプログラムがある。ほとんどのバージョン管理システム(Git、Subversion、CVS、RCSなど)は対応している。バージョン管理システムでもパッチは重要な要素である。 オープンソースの世界では、diff と patch を使って修正をやり取りするのが一般的である。あるフリーソフトウェアのソースを外部の者がダウンロードし、修正を加え、それを diff 形式でチームに送る。そうすると、チームメンバーはそれをパッチとして適用する前にレビューでき、外部の者がアクセスできるソースではなく、開発中の最新のソースにパッチを適用することで修正を取り込むことができる。 ファイル単位でパッチを作成するには、以下のコマンドをシェル上で実行する。$ diff -u test.c.orig test.c > mods.patch パッチを適用するには、以下のコマンドをシェル上で実行する。$ patch -p0 < mods.patch パッチファイル mods.patch 内にはパッチを適用すべきファイル名が書かれているためコマンド中に指定する必要がない。 パッチを適用前の状態に戻すには '-R' オプションを使用する。$ patch -p0 -R < mods.patch diff を適用したバージョン(上記test.c)とパッチを適用しようとしているバージョンが異なる場合、パッチは正しく適用できない。例えば、パッチを適用しようとしているテキストの先頭に行が挿入されていると、パッチファイル内に書かれている行番号が一致しなくなる。patch はパターンマッチングで修正する前後の行を特定するため、ある程度は変更に対処できる。また修正箇所近辺の内容が違っている場合も対処可能である(fuzz)。ただし、独自の修正を加えられたソースにパッチを適用して正しく動作するかは保証されない。 フォルダ単位でパッチを作成し、元に戻すには以下のように行う。$ diff -ur old new > mods.patch$ cd old$ patch -p1 < mods.patch サブディレクトリにあるファイルへのパッチ適用には -pnumber オプションを必要とし、ソースツリーのベースディレクトリがパッチファイルに含まれている場合は number に 1、さもなくば 0 を指定する。例えば、git などを使うと、a/test.c と b/test.c に対するパッチという形で古い方を仮想的にフォルダa、新しい方を仮想的にフォルダbに入れるので、この形式のパッチは、patch -p1 < mods.patch を使う。 UNIX系システムが起源だが、patch はMicrosoft Windowsなどにも移植されている。Windows 版の patch は ⇒GNU utilities for Win32 にある。 Windows Vista 以後はプログラム名に「patch」という単語が含まれていると UAC によってマルウェアと判断されるので、UAC に対応したものを利用する必要がある。
歴史
使用法
ソフトウェア開発におけるパッチ
使用例
ファイル単位
フォルダ単位
移植
関連項目
パッチ
diff
rsync
xdelta
外部リンク
⇒patch(1) - マニュアル
⇒patchutils - パッチ操作ユーティリティ
⇒GNU tools for Win32 - Win32 への移植版(diff と patch を含む)(Version 2.5.9-7 UAC制限)
⇒GNU utilities for Win32 - Win32 への移植版(diff と patch を含む)(Version 2.5 UAC制限)
Git for Windows
⇒Strawberry Perl for Windows - Win32 への移植版が付属している (Version 2.5.9 UAC対応済)
⇒diffstat
表
話
編
歴
Unixコマンド
ファイルとファイルシステム管理
cat
chattr
chmod
chown
chgrp
cksum
cmp
cp
dd
du
df(英語版)
file
fsck
fuser(英語版)
ln
ls
lsof
mkdir
mount
mv
pax
pwd
rm
rmdir
size
split
tee
touch
type(英語版)
umask(英語版)
プロセス管理
at
bg
chroot
cron
fg
kill
killall
nice
pgrep
pidof
pkill
ps
pstree(英語版)
reboot
shutdown
time
top
ユーザ管理/環境
clear
env
exit
finger
history(英語版)
id
logname(英語版)
mesg
passwd
su
sudo
uptime
talk
tput(英語版)
uname
w
wall
who
whoami
write
テキスト処理
awk
banner
basename
comm(英語版)
csplit(英語版)
cut
diff
dirname
ed
ex(英語版)
fmt
fold(英語版)
head
iconv
join(英語版)
less