世界を動かす技術を、日本語で。

あなたはすでにGitサーバーを持っています

2025年10月26日原文(maurycyz.com)

概要

  • Gitリポジトリ をサーバーで管理し、SSH経由で クローン・同期 する方法の解説
  • receive.denyCurrentBranch 設定による 複数端末での作業最適化
  • git-over-http 公開のための update-server-info 運用手順
  • Gitフック を活用した自動処理や静的サイト生成の実践例
  • バックアップバージョン管理 による安全性の確保

サーバー上のGitリポジトリをSSH経由でクローン・同期する方法

  • サーバー上に Gitリポジトリ を設置し、 SSHアクセス を利用した運用
  • ローカル端末で以下のコマンドを実行し、リポジトリをクローン git clone ssh://username@hostname/path/to/repo
  • ローカルで作業後、 originサーバーへプッシュ 可能
  • デフォルトでは、 現在チェックアウト中のブランチへのプッシュは禁止
  • サーバー側で以下コマンドを実行し、制限を緩和 git config receive.denyCurrentBranch updateInstead
  • 複数PC間での コード同期 や、 サーバー側ファイル編集 の効率化

GitリポジトリをHTTP経由で公開する手順

  • Webサーバーに Gitリポジトリ を公開し、HTTPクローンを有効化 git clone https://hostname/path/to/repo/.git
  • .gitディレクトリ名をURLから省略するにはサーバー側設定やリネームが必要 (ただしリネームはサーバー側Git操作が制限されるため注意)
  • HTTP経由でのクローンを有効にするため、サーバーで以下コマンドを実行 git update-server-info
  • リポジトリ更新のたびに再実行 が必要

git update-server-infoの自動化とGitフック活用

  • post-updateフック を利用し、git update-server-infoの自動実行を設定
    • サンプルフックをコピー cp .git/hooks/post-update.sample .git/hooks/post-update
    • 実行権限を付与 chmod a+x .git/hooks/post-update
  • post-updateフック はシェルスクリプトとしてカスタマイズ可能
  • 例えば、 静的サイトジェネレータ の自動実行も可能
    cat > .git/hooks/post-update <<EOF
    #!/bin/sh
    set -euo pipefail
    cd /path/to/site
    /path/to/generator
    EOF
    chmod a+x .git/hooks/post-update
    
  • ネットワーク遅延なくローカルで執筆 し、サーバーへプッシュ後に自動処理

Git運用のメリットと安全性

  • サーバー障害時も ローカルコピー がバックアップとして機能
  • 端末故障時も サーバーからの再取得 が可能
  • バージョン管理機能 により、誤削除やトラブル時の原因特定が容易
  • 信頼性と効率性 を両立した運用手法

Hackerたちの意見

もしかしたら年を取りすぎたのかもしれないけど、gitを使うのにsshアクセスが必要だって知らない人って本当にいるの?

ほとんどの人はgit=githubだと思ってるよね。

あまり知られていないことだけど、ディレクトリからクローンできるよ。バックアップ機能は実現できないけど、別のオプション/機能だね。

私も知らなかった - というか、サーバーがgitリポジトリを公開するために何をする必要があるのか考えたことがなかった。でももっと重要なのは、サーバーに変更をプッシュしてデプロイする理由がよくわからないってこと。私の頭の中のモデルでは、リポジトリにはSOTが含まれていて、サーバー上で動いているものは一時的なものだから、その二つを混ぜたくないんだ。ホットフィックスのために個別のファイルをscpするよりは楽かもしれないけど、SOTにプッシュして、サーバーにsshで入ってそこから変更をプルするのと何が違うの?

昔はベアリポジトリをDropboxに置いて、そこから実際のパスにクローンしてた。それで、1. 同期の競合を心配しなくてよかった。完了したら、ただoriginにプッシュするだけ。2. コードが自分のコンピュータの外にバックアップされてた。正確には覚えてないけど、スペースを節約できてたかも。そう思ってたけど、今はよくわからない。でも、かなり信頼性があったと思う。GitHubに移行してからはその方法をやめたけど、Codebergtailscaleを使って移行を考えてる。今は、自分のパソコンをインターネットに出さずにたくさんの選択肢がある気がする。

この方法でGitHubやGitLabスタイルのCI/CDをやる面白い/クリエイティブな方法って何かあるかな?プッシュ時に次に何をするか決めるエントリーポイントスクリプトみたいなのが必要?プッシュの目的に応じて変数をどうやって決めるんだろう?

gitはほとんどの人が実際に使い方を知らないものの一つだから、そうだね。

実は先週これに気づいたばかりで、まだ試してないんだ。プログラミングをほぼ50年やってて、Gitを13年使ってるけど、バカじゃないよ(ただ、時々これに異議を唱える人もいるけど、特に配偶者とかね)。

2007年からgitを使ってるけど、これに気づいたのは去年のこと。Gitは特に、知ってる専門家たちが微妙に違う使い方をするから混乱しやすいんだよね。だから、文化としては自分なりの独自のウィザードになるまで適当にやる感じ。靴ひもを結べないウィザードになっちゃうけど、サンダルが好きだからね。

そうなんだ。公式の中央リポジトリが設定されない限り、一人ではプロジェクトを始められないって言われたことがある。俺は「git initさえあれば始められるよ」って返したけど、聞いてもらえなかった。

それについては考えたことなかったな。誰かに聞かれたら、もちろんそうだよねって思うけど。単に考えたことがなかっただけなんだ。

サーバー側でリポジトリをベアにしておけば、チェックアウトしたブランチや「.git」ディレクトリの名前変更を心配しなくて済むよ。

Hacker Newsで議論の続きを見る