標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

GitHub (Pages)で昔の静的ウェブコンテンツを保全する

終活の一環として、昔、大学のサーバーとか、レンタルサーバーに UP していた自分のホームページを、GitHub保全する作業を進めている。

(※ ここでは既にローカルにとってあるバックアップをウェブに保全し、閲覧可能にするところまで記す)

(1) GitHub保全する

GitHub にレポジトリを作り、普通にコミットして、git push するだけよい。

ただし、元のファイルの改行コードも当時のまま維持したいので、 * -text だけの内容のファイル:/.gitattributes をコミットし、改行コード変換を抑制する。git config --local core.autocrlf=false でも等価だが、複数マシンだと設定を忘れそうになるので、.gitattributes を使うのを習慣としている。

~/.gitignore などによる登録漏れに注意。.gitignore を一時的に他の名前にリネームするなどして無効化してから git status を実行し、漏れがないか確認しよう!1

(2) GitHub Pages で公開する設定を行う

HTML ファイルは GitHub で直接閲覧することはできない。保全するだけならばこれでよいが、読める形で公開したい場合は GitHub Pages を使用する。それには SettingPages より次のように設定する。

  • Source: Deploy from a branch

GitHub Actions は今回使わず、指定したブランチの内容をそのまま使う 2

  • Branch: master , /docs

/ (root) にしてもいいのだが、コンテンツに加工をしなければいけないケースが多いので、ソースは直下、加工済みコンテンツを /docs におく形とする。

(3) コンテンツの文字コードを変換する

GitHub Pages では、UTF8 以外の文字コードが使えない。HTML上で

 <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">

文字コードを指定しても、ウェブサーバーがヘッダで

Content-Type: text/html; charset=utf-8

と返してくるのをウェブブラウザが優先してしまうため、文字化けが発生してしまうのだ。文字化けしないように HTML ファイルの文字コードを変換しなければいけない。

そのため、全HTML ファイルの文字コードを一括変換する PowerShell スクリプトutf8.ps1 を作成した。内部から nkf32 と Perl を使っている3

function mirror($src,$dst){
    Get-ChildItem -Path $src | ForEach-Object {
        $name = $_.Name
        if ( $name -in @(".","..","docs",".git","utf8.ps1") ){
            return
        }
        $newname = (Join-Path -Path $dst -ChildPath $name)
        Write-Host ("{0}`n-> {1}" -f $_.FullName,$newname)
        if ( $_.PSIsContainer ){
            if ( -not (Test-Path $newname) ){
                New-Item -Path $newname -ItemType "Directory"
            }
            mirror ($_.FullName) $newname
        } else {
            if ($name -match '\.html?$') {
                nkf32 -w $_.FullName | perl -pe 'binmode(STDIN);binmode(STDOUT);s|"http://hp.vector.co.jp/authors/VA009797|"https://hymkor.github.io/hp.vector.co.jp_VA009797|g' > $newname
            } else {
                Copy-Item $_.FullName $newname -Force
            }
        }
    } | Out-Null
}

$src = (Get-Location)
$dst = (Join-Path -Path $src -ChildPath "docs")
mirror $src $dst

レポジトリの / (root) に chdir してから、pwsh utf8.ps1 4を実行すると、/ (root) 以下の全ツリーのコンテンツを /docs 以下へ展開してゆく。

  • 拡張子が .html もしくは .htm のものは、nkf32 で BOM なし UTF8 に変換する。
    • nkf32 のオプション、-w-w80 が BOM なしUTF8で、-w8 は BOM ありUTF8
  • Perl は HTML 内の外部リンクの一部を置換するために使っている
    • http://hp.vector.co.jp/authors/VA009797https://hymkor.github.io/hp.vector.co.jp_VA009797
    • 改行コード変換を抑制するために binmode(STDIN); binmode(STDOUT) を使っている

(4)GitHub へ UP する

変換がうまく出来たら、git add docs/git commitgit pushGitHub へ UP する。

UP すると、すぐ表示されるようになるわけではなく、デプロイするのに1分ほどかかるようだ。体感では意外と時間がかかって何か間違ったのではないかと不安になるところだが、コミットIDのところにデプロイ時のログが確認できるので、進捗や成否を確認しよう。

(5)もし公開をやめる場合

  1. ブラウザでそのまま見られないようにする:GitHub Pages の Branch を None にする
  2. レポジトリそのものもプライベートにして見られないようにする:Settings → General:Danger Zone:Change repository visibility → Change To Private

プライベートレポジトリにすると、本件では問題ないと思うが、★がゼロされてしまう。あまりカジュアルに Private ↔ Public を切り替えない方がいいので、1. だけで十分だろう


  1. ~/.gitignore を無効にしなくても git ls-files --others --ignored --exclude-standard | git add -f --pathspec-from-file - で、無視対象となっているファイルを強制的に登録させるのもアリ
  2. 与えられたテーマや、markdown → HTML 変換の仕組みを使うのならば、GitHub Actions の Jelly というツールを使えばよいようだが、今回は保全が目的なので、別にそういうの要らない
  3. PowerShell で全部やりたかったところだが、文字コード ISO-2022-JP などがうまく扱えないのと、nkf の自動文字コード判定機能に変わる機能なかったなどで、これらのツールを併用することにした。コンテンツは基本 ISO-2022-JP だけのはずであったが、うっかりと Shift_JIS のものも混ざってしまっていたのだ。個別指定するのは大変なので、自動判断に頼った。
  4. PowerShell 7 を使いたいので、PowerShell.exe ではなく、pwsh.exe を使う。PowerShell.exe だとスクリプトを実行する時のオプションが無駄に長いので