標題の話だけではつまらないのでgit commitしていないファイルが存在するときは aptitude installできないように細工した.
こうすることで,うっかりgit commitし忘れても パッケージのインストール/アンインストールまでには対応することだろう. だれがって自分がだけどさ.
月並な方法だが以下のようにして/etcをgit化した.
% cd /etc % sudo sh -c 'cat > .gitignore' <<EOF *~ *.dpkg-dist *.dpkg-old mtab ld.so.cache resolv.conf adjtime EOF % sudo git init % sudo git add . % sudo git commit -m 'gitized.'
.gitignoreは必要になったら追加しよう. 生成されたメニューのファイルについては入れるか入れないか迷ったけど, 迷ったので.gitignoreには入れずにgit管理することにした.
ディスク容量を多少喰う程度だけん,こういう場合は安全側に倒す. やめたくなったら.gitを削除するだけだしね.
以下の2つのファイルを用意した.
/usr/local/sbin/check-git-status 以下のようにして導入
# install -m 755 -o root -g root \
check-git-status /usr/local/sbin/check-git-status/etc/apt/apt.conf.d/09check-git-status 以下のようにして導入
# install -m 644 -o root -g root \
09check-git-status /etc/apt/apt.conf.d/09check-git-statusこれは,apt-get install/aptitude installなどでdpkgの実行前に/etcをチェックして コミット漏れのファイルがあれば,dpkgを実行させずにapt-get/aptitudeを終了させる\\ ものである.
check-git-statusの実行をapt-listbugsの実行前にしたかったので, 09check-git-statusという名前にした. apt-listbugsの実行前にしたかったかのは, apt-listbugsの確認を行った後でコミット漏れがあったときに失敗し, 次の実行のときにはapt-listbugsの出力内容を忘れてしまい, 再び確認するはめになることを防止するためである.
導入するとAPTやaptitudeを動作させるときに以下のようになる.
/etcのファイルが全てコミット状態なら通常通りAptitudeやAPTによってインストールできる. また,インストール後に未コミット状態のファイルを出すようにしてある.
% sudo aptitude install nginx パッケージリストを読み込んでいます... 完了 ... nginx (0.6.34-2) を設定しています ... # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # init.d/nginx # logrotate.d/nginx # nginx/ # rc0.d/K20nginx # rc1.d/K20nginx # rc2.d/S20nginx # rc3.d/S20nginx # rc4.d/S20nginx # rc5.d/S20nginx # rc6.d/K20nginx nothing added to commit but untracked files present (use "git add" to track) パッケージリストを読み込んでいます... 完了 ...
以下のようにインストール前に失敗し,未コミットなファイルを表示する.
% sudo aptitude install sl パッケージリストを読み込んでいます... 完了 ... 拡張状態情報を書き込んでいます... 完了 # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # init.d/nginx # logrotate.d/nginx # nginx/ # rc0.d/K20nginx # rc1.d/K20nginx # rc2.d/S20nginx # rc3.d/S20nginx # rc4.d/S20nginx # rc5.d/S20nginx # rc6.d/K20nginx nothing added to commit but untracked files present (use "git add" to track) E: Problem executing scripts DPkg::Pre-Invoke '/usr/local/sbin/check-git-status' E: Sub-process returned an error code パッケージをインストールできませんでした。復旧を試みています: ...
普通にgitを使う感じで/etcのファイルをコミットする.
% cd /etc % sudo git add . % sudo git commit -m 'aptitude install nginx'
コミットが終わったら,通常通りインストールが行える. slパッケージのように/etcにファイルを作成しないパッケージのみの場合はgit statusを実行しない.
% sudo aptitude install sl パッケージリストを読み込んでいます... 完了 ... sl (3.03-16) を設定しています ... パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 拡張状態情報を読み込んでいます パッケージの状態を初期化しています... 完了 拡張状態情報を書き込んでいます... 完了
% sudo touch /etc/some-change
% sudo aptitude purge sl
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
拡張状態情報を読み込んでいます
パッケージの状態を初期化しています... 完了
以下のパッケージが削除されます:
sl{p}
更新: 0 個、新規インストール: 0 個、削除: 1 個、保留: 0 個。
0B のアーカイブを取得する必要があります。展開後に 123kB のディスク領域が解放されます。
先に進みますか? [Y/n/?]
拡張状態情報を書き込んでいます... 完了
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# some-change
nothing added to commit but untracked files present (use "git add" to track)
E: Problem executing scripts DPkg::Pre-Invoke '/usr/local/sbin/check-git-status'
E: Sub-process returned an error code
パッケージをインストールできませんでした。復旧を試みています:
...
Android | Debian | LOOX T70HN | Linux | Rails | Rast | Ruby | TYPE T VGN-TZ90HS | boat | git | hardware | icfp | music | p | rd2odt | snowboard | software | surfing | tDiary | trekking | その他 | ボウリング | 映画 | 家族 | 会社 | 管理 | 丸藤 | 高専 | 散歩 | 仕事 | 自分 | 鼕