gitを使用してインストールされたパッケージのリストを追跡する

gitを使用してインストールされたパッケージのリストを追跡する

私のシステムはDebian Busterです。 gitを使用してインストールされたパッケージのリストを追跡したいと思います。

インストールされたパッケージのリストを使用する場合、リストdpkg -lはどこから入手できますか?

でいくつかのパッケージ情報が見つかり/var/lib/dpkg/statusましたが、そのファイルには私が興味のあるものよりも多くの情報が含まれています。パッケージリストが保存される場所は他にありますか?

インストールされたパッケージ、そのバージョン、または削除されたパッケージを知るための最良のトレースファイルは何ですか?

修正する

gitを使って/var/lib/dpkg/statusを追跡しようとしましたが、出力は非常に不明で混乱しました。ステータス情報が多すぎます。インストールされているパッケージのリストとそのバージョンを追跡するだけです。 dpkg -l の出力に似ています。

dpkg -l で示されたパッケージのリストは一部のファイルに保存されていますか、それとも毎回動的に生成されますか?

/var/lib/dpkg/にgitリポジトリを作成し、gitにいくつかのフィルタを作成して、デフォルトでdpkg -lの出力を追跡できますか?または、git statusを実行するたびにリストが動的に生成される可能性がありますか?それとも他の解決策がある場合は、gitがどのような可能性を提供するのかわかりません。

答え1

インストール済みパッケージのリストはい;これは/var/lib/dpkg/status正式な参照です。インストールされたパッケージは、「インストールの確認がインストール済み」の状態でこのファイルに表示されます。dpkg -lこのファイルは実行されるたびに処理され、ファイルに保存された情報は出力を生成するために使用されます。

より単純なデータセットを追跡して比較を簡素化するには、必要に応じて生成する必要があります。

インストールされているパッケージのリストを追跡するには、次を実行できます。

dpkg --get-selections

gitバージョンも必要なので、定期的に追跡されたファイルに出力を保存します。

dpkg -l

より適切かもしれません。

指摘したとおりマーティン・コンラッドここで生成された情報を使用して後でシステム状態を復元できるようにするには、手動でインストールされたタグも追跡する必要があり、保存も追加します。

apt-mark showmanual
apt-mark showhold

上記のすべてをフックに追加して、システムのすべての変更を追跡できます。dpkgたとえば、/etc/packages/ファイルを保存するには(代わりに/var/lib/dpkg「所有者」はdpkgそのまま残す必要があります)/etc/dpkg/dpkg.cfg.d/package-history

post-invoke="if [ -x /usr/local/bin/package-history ]; then /usr/local/bin/package-history; fi"

そして、/usr/local/bin/package-history次のファイルが含まれています

#!/bin/sh
cd /etc/packages
dpkg --get-selections > selections
dpkg -l > list
apt-mark showhold > holds
apt-mark showmanual > manual

後者は実行可能でなければなりません。

sudo chmod 755 /usr/local/bin/package-history

上記のコマンドの出力はすべて整列しているため、後処理する必要はありません。これらのファイルを使用すると、インストールされているパッケージの状態を正確に復元し、バージョンの変更を追跡し、削除されたが削除されていないパッケージを表示することもできます。

スクリプトに追加git commit(最初に変更を確認)したり、それを使用してファイルの変更を追跡したり、gitリポジトリ自体を作成したりすることもできます。フックを使用してファイルが更新されていることを確認してください。package-historyetckeeper/etc/packages/etc/packagesdpkgどのaptによって駆動されるか、またはdpkgに基づく他のパッケージ変更スクリプト自体内でコミットすると、コミット粒度は実行に対応し、関連するタスクdpkgに対応します。package-historydpkgetckeeperetckeeper

スクリプトで送信を処理するには、次を追加します。

if [ "$(git status --porcelain | wc -l)" -gt 0 ]; then
    git add *
    git commit -m 'Update package information'
fi

上記のスクリプトの最後に移動し、rootとして手動で一度実行してgit履歴を初期化する必要があります(後でmkdir /etc/packages; git init /etc/packages)。

答え2

パッケージのリスト(表示されているように)がdpkg -l一部のファイルに保存されていますか、それとも毎回動的に作成されますか?

Stephen Kittの答えはすでにこれを示しています。/var/lib/dpkg/status情報はそこにあり、他のすべては単にそれを解析することです。dpkg -l情報を1つの(デフォルト)形式で表示しdpkg-query(本質的にはdpkg -l)他の形式で情報を表示するために使用できます。


同様の機能を持つパッケージからインスピレーションを得ることができ、etckeeper。パッケージの変更に対する変更をコミットdpkgするためのフックを追加し、コミット/etcメッセージにパッケージのリストを含めます。 gitはパッケージリストを追跡しないので、直接使用することはできません。

次のフックを追加します。

# cat apt/apt.conf.d/05etckeeper
DPkg::Pre-Invoke       { "if [ -x /usr/bin/etckeeper ]; then etckeeper pre-install; fi"; };
DPkg::Post-Invoke      { "if [ -x /usr/bin/etckeeper ]; then etckeeper post-install; fi"; };

RPM::Pre-Invoke       { "if [ -x /usr/bin/etckeeper ]; then etckeeper pre-install; fi"; };
RPM::Post-Invoke      { "if [ -x /usr/bin/etckeeper ]; then etckeeper post-install; fi"; };

dpkg-query -W -f '${Status}\t${Package} ${Version} ${Architecture}\n'パッケージリストを取得するために、etckeeperジョブ自体が呼び出されます。

だからあなたはそのようなことをすることができます。以下を含むファイルを作成します/etc/apt/99-track-packages

DPkg::Post-Invoke       { "/some/script"; };

次の/some/scriptようになります。

#! /bin/sh
cd /some/git/directory
dpkg -l >> list-of-packages
git commit -am 'some message'

その後、aptが呼び出されるたびにコミットが行われますdpkg

関連情報