簡體   English   中英

差兩轉? -- linux

[英]diff two rpms? -- linux

對我的基線 (java/C++) 進行了一些未知的更改並安裝在新的 rpm 中。 我想要一種方法來比較此 rpm 的內容與舊的 rpm 以查看所做的更改。 這可能嗎?

如果沒有簡單的方法可以做到這一點,有沒有辦法獲得按日期組織的 rpm 文件名的內容列表?

嘗試pkgdiff來可視化 RPM 包之間的差異:

pkgdiff PKG-0.rpm PKG-1.rpm

如果您比較 SRC.RPM,那么該工具也會提取並比較內部 tarball(除非定義了-skip-subarchives選項)。

在此處輸入圖片說明

在此處輸入圖片說明

如果你有以前的 rpm 包文件,你可以解壓它,例如,使用unrpm到一個臨時目錄並使用diff -r來比較結果。

這是我用來說明兩個 ncurses 開發版本之間的示例:

#!/bin/sh

failed() {
    echo "? $*" >&2
    exit 1
}

# get the package filename as parameter, defaulting to one used for example
oldpkg=$(readlink -f "${1:-/tmp/ncurses6-6.0-20150926.x86_64.rpm}")
pkgname=$(rpm -qip "$oldpkg" 2>/dev/null | awk '/^Name .*:/ { print $3; exit 0; }')

[ -f "$oldpkg" ] || failed "no package file found: $oldpkg"
[ -n "$pkgname" ] || failed "no package name found in $oldpkg"

# The tags for this question are "linux" and "rpm", so mktemp and bash are assumed.
tempdir=$(mktemp -d "${TMPDIR:-/tmp}/pkgcompare.XXXXXX")
trap 'rm -rf "$tempdir"' EXIT ERR

# Fedora sets CDPATH, which would echo (cancel that).
unset CDPATH

mkdir -p "$tempdir"/{new-version,old-version}

cd "$tempdir/new-version" || exit
# the query returns absolute pathnames beginning with "/"
rpm -ql "$pkgname" | while :
do
    read path
    [ -z "$path" ] && break
    [ -d "$path" ] && mkdir -p ".$path"
    [ -f "$path" ] && mkdir -p "./${path%/*}"
    [ -f "$path" ] && cp -p "$path" ".$path"
done

cd "$tempdir/old-version" || exit
rpm2cpio "$oldpkg" | cpio -i -d 2>/dev/null

cd $tempdir || exit
# I would usually pipe this into diffstat, but you may want the actual diffs
diff -r -u -N old-version new-version | diffstat

和輸出(只剩下diffstat ,其他輸出被抑制):

 bin/ncursesw6-config           |    2 +-
 include/ncursesw6/curses.h     |    8 ++++----
 include/ncursesw6/ncurses.h    |    8 ++++----
 lib64/libncurses++w6.so        |binary
 lib64/libncurses++w6.so.6      |binary
 lib64/libncurses++w6.so.6.0    |binary
 lib64/libncursesw6.so          |binary
 lib64/libncursesw6.so.6        |binary
 lib64/libncursesw6.so.6.0      |binary
 lib64/libtinfow6.so            |binary
 lib64/libtinfow6.so.6          |binary
 lib64/libtinfow6.so.6.0        |binary
 lib64/pkgconfig/formw6.pc      |    2 +-
 lib64/pkgconfig/menuw6.pc      |    2 +-
 lib64/pkgconfig/ncurses++w6.pc |    2 +-
 lib64/pkgconfig/ncursesw6.pc   |    2 +-
 lib64/pkgconfig/panelw6.pc     |    2 +-
 lib64/pkgconfig/ticw6.pc       |    2 +-
 lib64/pkgconfig/tinfow6.pc     |    2 +-
 19 files changed, 16 insertions(+), 16 deletions(-)

您當然可以將相同的方法應用於兩個 rpm 包; 這個問題表明一個已經安裝,另一個可能可以訪問。

要嚴格比較兩個 rpm 文件(我們稱它們為one.rpmanother.rpm ),您需要檢查組成文件摘要以及檢查[un] 安裝前和 [un] 安裝后的腳本(因為這些腳本可能會修改系統狀態):

$ diff <(rpm -q --dump --scripts -p one.rpm) <(rpm -q --dump --scripts -p another.rpm)

您可能還想比較簽名者(如果有):

$ diff <(rpm -q --qf '%{SIGPGP:pgpsig}\\n%{SIGPGP:armor}\\n' -p one.rpm) <(rpm -q --qf '%{SIGPGP:pgpsig}\\n%{SIGPGP:armor}\\n' -p another.rpm)

(或者, 如果你特別迂腐

$ diff <(rpm -q --qf '%{DSAHEADER:pgpsig}\\n%{DSAHEADER:armor}\\n%{RSAHEADER:pgpsig}\\n%{DSAHEADER:armor}\\n%{SIGGPG:pgpsig}\\n%{SIGGPG:armor}\\n%{SIGPGP:pgpsig}\\n%{SIGPGP:armor}\\n' -p one.rpm) <(rpm -q --qf '%{DSAHEADER:pgpsig}\\n%{DSAHEADER:armor}\\n%{RSAHEADER:pgpsig}\\n%{DSAHEADER:armor}\\n%{SIGGPG:pgpsig}\\n%{SIGGPG:armor}\\n%{SIGPGP:pgpsig}\\n%{SIGPGP:armor}\\n' -p another.rpm)
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM