公開リポジトリの特定ファイルのみをgit-cryptで暗号化
公開日: 2026/03/16 / 更新日: 2026/03/28
Git Hubに配置したソースコードのうち一部のファイルやディレクトリを見られたくない時は、privateにするかgitignoreが普通である。しかし、不特定多数に対してgit cloneしてもらいたいし、バージョン管理もしたいし、特定の人物には確認してもらいたいってときもある。
そんなとき便利なgit-cryptを使ってみた。
これは、リポジトリ内の特定のファイルやディレクトリを暗号化して読めなくするもの。これで暗号化すると、たとえpublicリポジトリであっても、任意のファイルの中身を意味のわからないバイナリに変換することができる。暗号化方式はいくつかあるが、今回はシンプルな共通鍵方式でいく。つまり自分以外に見せるには、共通鍵を渡して復号してもらう必要がある。
暗号化
まずは、PCにインストールする。
brew install git-crypt(git-cryptはC++でNode.jsと関係ないからnpmは使わない。私は脳死でnpmして、同名のよくわからないライブラリを入れてしまった。)
次に、対象のルートディレクトリで、git-cryptを初期化する。
git-crypt initそしたら、ルートに.gitattributes というファイルを作成して、どれを暗号化するか指定する。
secret.md filter=git-crypt diff=git-crypt #"secret.md"のみを暗号化
*.secret.md filter=git-crypt diff=git-crypt #"〜.secret.md"系のファイルをまとめて暗号化
docs/** filter=git-crypt diff=git-crypt #docsディレクトリ内のすべてのファイルを暗号化ちなみに、この命令は上から順に実行されて上書きされていくためしたから順に優先度が高い。例えば、docs内の"public.md"以外を暗号化したい場合は以下のように書けばいい。
docs/** filter=git-crypt diff=git-crypt #一旦docs全体選択
docs/public.md !filter !diff #これが除外コマンドあとは、通常通りコミットしてpushするだけ。Git Hubのサイトで確認するか、以下のコマンドで暗号化できているか確認できる。
git-crypt statusすると以下のように表示されて、docs内のファイルが暗号化されていることがわかる。
not encrypted: .gitattributes
not encrypted: .gitignore
not encrypted: README.md
not encrypted: app/favicon.ico
not encrypted: app/globals.css
not encrypted: app/layout.tsx
not encrypted: app/page.tsx
encrypted: docs/test.md
encrypted: docs/test01.md
not encrypted: eslint.config.mjs
not encrypted: next.config.ts
not encrypted: package-lock.json
not encrypted: package.json
not encrypted: postcss.config.mjs
not encrypted: public/file.svg
not encrypted: public/globe.svg
not encrypted: public/next.svg
not encrypted: public/vercel.svg
not encrypted: public/window.svg
not encrypted: tsconfig.json復号化
準備として、同一リポジトリのルートディレクトリで以下のコマンドを実行することで復号に使用でいる共通鍵ファイルを任意のパスでエクスポートする。今回はデスクトップに"key"という名前のファイルとして保存するように指定している。
git-crypt export-key ~/Desktop/keyこのファイルを渡すことで暗号を解読してもらうことができる。
これを受け取った側は、クローンしてきたリポジトリ内で以下のコマンドをこの鍵ファイルのパスとともに実行すれば良い。ただし、解読する側のPCにもgit-cryptのインストールが必要なので予め入れとく必要あり。
git-crypt unlock もらった鍵を保存した場所ちなみに、一度アンロックしてしまえば今後pullする内容は自動で復号されるし、当該ファイル内を書き換えてpushした場合は自動で暗号化される。
ライター
HARLYA
無能アリ
趣味でフルスタック開発をしている。巨人の肩に乗りまくりで四捨五入すればエンドユーザー。