HSPのGit設定 [2023年5月]

除外設定、エンコーディング・行終端の設定、言語指定など

この記事ではGitでHSPのスクリプトファイルなどをバージョン管理するための設定の内容とその詳細を書きます

なお、この記事ではUTF-8版や64bit版は扱っていません

結論

はじめに結論として、現時点でよさそうな設定は次の通りです

1. リポジトリの中に .gitignore, .gitattributes の2つのファイルを置きます:

.gitignore:

hsptmp
obj
packfile
*.ax
*.dpm
*.exe
*.i

.gitattributes:

*.as diff=cp932 -text linguist-language=hsp3
*.hsp diff=cp932 -text linguist-language=hsp3
*.hs diff=cp932 -text linguist-language=txt

2. 次のコマンドを実行してユーザー設定を更新します:

git config --global diff.cp932.textconv 'iconv -f cp932'

または、ホームフォルダにある .gitconfig という名前のファイル (なければ作る) を開き、その末尾に次の設定を追加します:

[diff "cp932"]
	textconv = iconv -f cp932

詳しく

ここからは設定の効果や意図を書きます。 解説風に書きますが、目的は設定の内容を理解してもらうというよりは、設定の詳細を明確にすることです。 後になって、なんでこういうふうにしたんだけっとなったときに、書き残してあったほうがよいので

(完全に理解するべしというわけではない)

.gitignore

.gitignore はGitにコミットしなくていいファイルを指定するための設定ファイルです

HSPのスクリプトエディタやコンパイラは、デバッグ時や実行ファイルの作成時に一時ファイルを作成します。 これらのファイルはバージョン管理したり保存しておかなくてよいです

.gitignore ファイルを作成すると、そこで指定された名前のファイルは除外されます。 また、* を適当な文字列に置き換えて一致するようなファイル名も除外対象となります

除外設定されたファイルは git add . などのコマンドによってインデックスに追加されなくなります。 これによりコミットに誤って含めてしまうことを防げるわけです

除外対象

  • hsptmp, obj, packfile, *.ax, *.dpm: コンパイル時や実行ファイルの作成時に生成される一時ファイル
  • *.exe: 実行ファイル
  • *.i プリプロセッサの処理後のスクリプト (#cmpopt ppout 1 が設定されていると生成されます)

参考

.gitattributes

.gitattributes はGitがファイルをどう扱うかを制御する設定ファイルです。 これに エンコーディング, 行終端, 言語指定 の設定をします

(エンコーディングについて): Gitはテキストファイルを UTF-8 エンコーディングと想定して扱います。 しかしHSPの通常のスクリプトファイルは別のエンコーディングなので、文字化けが発生することがあります

(行終端について): Gitは 行終端の正規化 という機能があり、改行文字をLF/CRLFで相互に変換することがあります。しかしHSPではCRLFのほうが都合がよく、行終端の正規化によって問題が発生することがあります

(言語指定について): 後述

最終的な .gitattributes は冒頭の通りですが、説明のため、いくつかの段階に分けて述べます

エンコーディングの変換

スクリプトファイルのエンコーディングはshift_jisと呼ばれることが多いですが、厳密にいえば cp932 のようです。 Gitが git showgit diff などのコマンドでファイルを読むときに自動でエンコーディング変換をするように、次のような設定でできるようです

*.hsp diff=cp932

記法: .gitattributes は行ごとに設定を書きます。*.hsp は拡張子が .hsp のファイルすべてということで、diff=cp932diff という属性に cp932 という値を設定するということです

加えて、diff=cp932 のファイルに行うべき変換処理をGitに登録します。 これはリポジトリごとにやるのではなく、ユーザーの設定を変更してしまってよいでしょう (悪い副作用はないはず)

(冒頭の繰り返しになりますが) 次のコマンドによって設定を追加できます:

git config --global diff.cp932.textconv 'iconv -f cp932'

これをやるとホームフォルダの .gitconfig に設定が追加されます

ちなみに iconv というのはエンコーディングを変換するコマンドです (おそらくGitに同梱されている)

この設定では、Gitがファイルを読み取るときに変換が発生しますが、ファイルを格納したり取り出したりするときは発生しません。 すなわち、リポジトリに保存されるデータはcp932のままです

行終端の正規化の無効化

(行終端は 改行文字 のことで、LF/CRLFです。それについては参考記事をみてください)

前述の通り必要のない機能なので、行終端の正規化をHSPのファイルに対して無効化するための設定を .gitattributes に追加しましょう:

*.hsp -text

(diff=cp932 の部分は略)

記法: -texttext 属性を取り除くという意味合いのようです

ちなみに eol (end of line, 行の終わり) という属性もありますが、これは正規化の処理の内容を制御するものなので、正規化を行わないのであれば使われないはずです

(他の方法との比較): ユーザーの設定を変更することによって行終端の正規化を無効化できるという記述がほかの記事でしばしばみられます。 これはあくまで私の意見ですが、その設定を変更するとほかのユーザーの環境で問題が起きたり、HSP以外のことにGitを使っている場合に問題が起きたりするので、おすすめしません。 リポジトリに固有の設定を使う方法もあり、それなら問題は軽減されます。 .gitattributes なら他の環境でも一貫した設定が適用されるので、こっちがベターな気がします

言語指定 (おまけ)

これは 省略可能 です。GitではなくGitHubのための設定となります

GitHubではファイルの拡張子からプログラミング言語を推定し、リポジトリがどの言語のものかを推定する機能があります。 HSPでしばしば使われる .as, .hs はほかのプログラミング言語に推定されてしまいます。 そのこと自体に実害はなさそうですが、ここではほかの設定のついでに、ファイルの言語を明示的に指定する設定を行います

*.as linguist-language=hsp3
*.hsp linguist-language=hsp3
*.hs linguist-language=txt

以上をまとめると冒頭の通りになります (再掲):

*.as diff=cp932 -text linguist-language=hsp3
*.hsp diff=cp932 -text linguist-language=hsp3
*.hs diff=cp932 -text linguist-language=txt

参考

エンコーディング関連:

(書き損ねた話: iconvに指定するエンコーディングをcp932ではなくsjisにして、スクリプトに「はしご高」(髙, U+9AD9)を含めて保存し、git show をするとエラーが起こるのをみました)

関連記事