tanacasinoのメモ

what are you waiting for ?

Git の http proxy に関するまとめ

この記事は、Git Advent Calendar 2013 の21日目の記事です。

前日(20日目)の記事は、@harupong さんの Get Great Pro Git !! です。
Pro Gitのサイトは、git関連のことでググると大体行き着くので、よく見てましたが、書籍だったんですね。それを無償公開で、さらには継続的に更新されているとは・・・。また、日本語翻訳は非常にありがたいので感謝感謝です。


Gitでは、ローカルレポジトリとリモートレポジトリ間のデータ転送(clone/push/pull/fetchなど)用のプロトコルに、Local、ssh、git、httpの4つが使用できます。

圧倒的にsshやgitを使用するケースが多かったように思いますが、最近ではGitHubもhttpsプロトコルが clone URLのデフォルトになっているようにみえます。 これは企業等のファイアウォール内から使用する人にもGitが普及してきたという事かもしれません。 私も http proxyサーバを経由せねば外部にアクセス出来ない環境にいることがあるため、SSHなどの利用に不自由することが多いです。

そこで私のように社内LAN等から http proxy サーバ経由で Gitレポジトリを扱わねばならぬ人のためのまとめです。

ちなみに、git http proxy でググるgit config --global http.proxy の話がすぐ見つかるので、それプラスアルファのまとめです。 ほとんどの人にとってそれだけで十分ですw

  1. 環境変数を使用する

    GitはUNIX環境でよくある http_proxy/https_proxy 環境変数が使えます。

     $ export http_proxy=http://proxy.example.com:8080
     $ export https_proxy=$http_proxy
     $ git clone https://github.com/tanacasino/dotfiles.git
    

    認証付きのproxyを利用している場合は、ユーザ名とパスワードは以下のように設定できます。

     $ export http_proxy=http://<username>:<password>@<hostname>:<port>
    
  2. $HOME/.gitconfig に書く

    毎回 環境変数を指定するのは面倒ですし、bashrcなどに http_proxy を書くと proxyを使ってほしくないツールにも影響が出るので記載したくない。 そんな時は $HOME/gitconfighttp.proxy を設定します。

      $ git config --global http.proxy http://proxy.example.com:8080
      $ cat $HOME/.gitconfig
      ...
      [http]
          proxy = http://proxy.example.com:8080
    

    これで git clone/push/fetch/pull/ls-remote などの使用時に自動的に proxyを使用してくれます。 ちなみに、http/https の両方のケースでhttp.proxyを使用してくれるので https.proxy の設定は不要です。 というか、https.proxyという設定はGit的に存在しないように見えます。

  3. REPOSITORY/.git/config に書く

    $HOME/.gitconfig で設定すると、そのユーザで git を使う際のすべてに影響します。 例えば、GitBucketGerrit といった、httpプロトコルでGitレポジトリを提供するアプリケーションを社内LANに設置している場合、 $HOME/.gitconfig に書いた http.proxy の設定のせいで、社内のレポジトリを使用する際も、proxy を経由してしまいます・・・。

    通常ですと、 no_proxy を設定すればええんやー!と考えるかもしれませんが、 残念ながら git では no_proxy という設定がなく使用できません。

    このような場合は、 $HOME/.gitconfig に書くのをやめて、各レポジトリ.git/config に proxyを設定することで回避できます。

     $ mkdir dotfiles
     $ cd dotfiles
     $ git init
     $ git config --local http.proxy http://proxy.example.com:8080
     $ git remote add origin https://github.com/tanacasino/dotfiles.git
     $ git fetch
    

    これで、レポジトリ毎に proxyを設定できるので、社外(eg. GitHub, BitBucket)、社内(eg. GitBucket, Gerrit)のgitレポジトリを使うといった混在環境でも困りません。

  4. REPOSITORY/.git/config で リモートレポジトリ毎に proxy を設定する

    3番までで完璧と思いきや gitではリモートレポジトリを複数設定できますので以下のように、社外のレポジトリと社内のレポジトリの両方をみるレポジトリを使うことがあります。(いや私だけかもしれませんが。。。)

    私の場合は、GitHubに置いてある dotfiles 群のうち、仕事向けに完全に特化する内容(ユーザ名・メールアドレスやproxyのための設定など)を GitHub にpushするのは怒られそうな気がするので、社内業務の設定は、社内の GitBucketレポジトリに pushして、その他の修正を受け取るために、upstream レポジトリとして GitHub を使用しています。

     # 以下のように origin がLAN内のGitBucket、upstreamがGitHub
     $ git remote -v
     origin  https://192.168.32.10/gitbucket/git/tanacasino/dotfiles.git (fetch)
     origin  https://192.168.32.10/gitbucket/git/tanacasino/dotfiles.git (push)
     upstream  https://tanacasino@github.com/tanacasino/dotfiles.git (fetch)
     upstream  https://tanacasino@github.com/tanacasino/dotfiles.git (push)
     # この場合は、 globalに http.proxyを設定するわけにもいかず。。。
    

    さて、このような場合は no_proxy を使うんや!そうや絶対そうやー!と思いますが、no_proxy はありませんので、諦めます。 このようなケースでは、REPOSITORY/.git/config でリモートレポジトリ毎に proxy を設定します。

     $ cd dotfiles
     $ vim .git/config
     [remote "origin"]
         # ここにも proxy が書けるんだぜ!!!
         # 以下のように空白にしておけばproxyを使用しない
         proxy =
     [remote "upstream"]
         # 以下は、http.proxy を設定している場合は不要ですが載せておきます
         # proxy = http://proxy.example.com:8080
    

    これで、リモートレポジトリが外部・内部にわかれててややこしい感じでも問題なっしんぐ!

  5. no_proxyを使えるようにしてみる

    長々といろいろな http proxy 設定してきましたが、3番以降の問題はGitが no_proxyを使えない!という話です。 とりあえず無理やり追加してみました。

    私はC言語の読み書きはできませんので http.proxy の設定部分のコードのコピペだけで作ってみました。 誰か詳しい人が upstream向けにパッチを作ってくれるんじゃないかという期待。

    使用方法は以下の通り。prefix 等はいい感じに自分の環境でどうぞ。CentOS6.4でもビルドできましたが手順はどっかいっちゃいました。

     # Ubuntu 12.04でのビルド手順
     $ sudo apt-get build-dep git
     $ wget http://git-core.googlecode.com/files/git-1.8.4.3.tar.gz
     $ tar xzf git-1.8.4.3.tar.gz
     $ cd git-1.8.4.3
     # apply patch
     $ wget https://gist.github.com/tanacasino/7528954/raw/0ca5bf774a88189ffaca9bf69917d6c29130eb9e/git-1.8.4.3-noproxy.patch
     $ git apply git-1.8.4.3-noproxy.patch
     # build and install
     $ ./configure --prefix=$HOME/local/packages/git-1.8.4.3-noproxy
     $ make
     $ make install
     $ $HOME/local/packages/git-1.8.4.3/bin/git --version
     git version 1.8.4.3
    
     # gitconfig
     [http]
         proxy = http://proxy.example.com:8080
         noproxy = localhost,192.168.32.10
    

このように http proxyの設定1つだけでも、いろいろあって楽しめますね!


明日22日目は、@kozyty さんの記事になります。お楽しみに! Git Advent Calendar 2013