除外設定、エンコーディング・行終端の設定、言語指定など
この記事では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
が設定されていると生成されます)
参考
- ファイルを無視する - GitHub Docs (GitHubが公開しているGitのガイド)
- gitignore Documentation - Git (Gitの公式ドキュメント, 英語)
- gitignore/HSP.gitignore · GitHub (設定を集めたリポジトリにあったやつ)
.gitattributes
.gitattributes
はGitがファイルをどう扱うかを制御する設定ファイルです。
これに エンコーディング, 行終端, 言語指定 の設定をします
(エンコーディングについて): Gitはテキストファイルを UTF-8 エンコーディングと想定して扱います。 しかしHSPの通常のスクリプトファイルは別のエンコーディングなので、文字化けが発生することがあります
(行終端について): Gitは 行終端の正規化 という機能があり、改行文字をLF/CRLFで相互に変換することがあります。しかしHSPではCRLFのほうが都合がよく、行終端の正規化によって問題が発生することがあります
(言語指定について): 後述
最終的な .gitattributes
は冒頭の通りですが、説明のため、いくつかの段階に分けて述べます
エンコーディングの変換
スクリプトファイルのエンコーディングはshift_jisと呼ばれることが多いですが、厳密にいえば cp932 のようです。
Gitが git show
や git diff
などのコマンドでファイルを読むときに自動でエンコーディング変換をするように、次のような設定でできるようです
*.hsp diff=cp932
記法: .gitattributes
は行ごとに設定を書きます。*.hsp
は拡張子が .hsp
のファイルすべてということで、diff=cp932
は diff
という属性に 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
の部分は略)
記法: -text
は text
属性を取り除くという意味合いのようです
ちなみに 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
参考
- gitattributes Documentation - Git (公式, 英語)
- 行終端を処理するようGitを設定する - GitHub Docs
- HSP3製アプリをGitHubで公開する時は改行コードに要注意 (2021-10-19)
- Git / SourceTree で、Shift JIS ファイルの差分を文字化けなく表示する - Qiita
- .NETのソースをgit管理する際にやること
エンコーディング関連:
- iconv と Shift_JIS
- SJISはShift_JISのエイリアスじゃない - freee Developers Hub (sjis=windows-31j)
(書き損ねた話: iconvに指定するエンコーディングをcp932ではなくsjisにして、スクリプトに「はしご高」(髙, U+9AD9)を含めて保存し、git show
をするとエラーが起こるのをみました)