Edited at
GitDay 19

PythonでGitのサーバーを作った話


Git server on python3

Git Advent Calendar 20日目にも続いているような記事です。

Markdown対応GitバックエンドのWikiシステム - Qiita Git Advent Calendar 20日目

Python で使えるSmart HTTPに対応した簡単なGitサーバーを作りたいなと思いました。まず成果物はこちら。リポジトリ

と言っても、Gitサーバーのサンプルとしての目的なので、大したことしていませんし、参考程度にどうぞ


動機

もともとGitのバックエンドなwikiを作りたいと思っており、今回参考になる物を・・・と思って探したらありました。git-server.py

ただ、Python2向けで作られていたので、今のPython3で動かしたく若干手直ししないといけない部分がありました。

ついでに、どこでも簡単に動かしやすいサンプルとして作りました。


必要な物


  • Python3(Python3.5で確認しています。)


    • flask



      • pip install flask あたりでFlaskをインストールしてください。





  • git client(1.8以降で確認しています。)

  • Linux, Windows で動くことを確認しております。


元からの修正点


  • Python 2 to Python 3


    • StringIO ・・・ Python2 to Python3 のアルアル



  • PackStreamReader の廃止


    • 元々は、receive packを取得する際に使っている模様ですが、そこまでする必要が無ければ参照する必要もないという事で消しています。



  • HTTPBasicAuth


    • サンプルとして作るうえでは不要かなと思って削除しております。



  • Subprocess のブロッキング処理周りを若干修正して動くようにしました。

  • gzip対応


    • git clientは大きいサイズのデータをpushする際は、gzipな圧縮形式で送ってきますので、リクエストヘッダーを判断して送られてきたgzipをunpackします。



  • サーバー設定ファイル化



    • config.ini から設定情報を読み取るようにしています。



  • ログ出力対応


    • logs ディレクトリにログを出力するようにしています。




その他


  • nginx等Webサーバーのリバースプロキシー(SSL)を使っても動作する事を確認しています。


  • git-http-backend も使えばいけそうですが、後々Git clientをラッピングした物の方が、その他の処理で幅が出るなと思って git clientを使っています。

  • 後日書く予定のGitバックエンドのwikiシステムのGitサーバー部分だけの機能のものです。


参考