Basic認証がかかっているリポジトリにgit・hgでアクセスする際、ユーザ名とパスワードを保存する方法

Basic認証がかかっているリポジトリにgit・hgコマンドやTortoiseGit・TortoiseHgでアクセスする際、毎回認証画面が出て、ユーザ名とパスワードを聞かれる。これを自動化する方法。

Gitの場合

追記 ==================

Git 1.7.9以上であれば「Credential helper」を使うことでnetrcを使わずにすむようです。
GitをHTTP経由で使うときのパスワードを安全に扱いたい – idesaku blog – 

使ってみました。
git credential helperを使ってHTTP越しで認証がかかっているリポジトリにアクセスする | misty-magic.h

======================

参考:Tempus – 昨今明日: git リポジトリを HTTP で公開する設定でハマリました
gitのHTTP認証に絶望した! – 永遠に未完成
Git – How to use .netrc file on windows to save user and password – Stack Overflow

ホームディレクトリにnetrcファイルを作成し、認証情報を書く
設定ファイルの位置

  • $HOME/.netrc(Linux)
  • C:\Documents and Settings\ユーザ名\_netrc (Windows XP以前)
  • C:\Users\ユーザ名\_netrc (Windows Vista以降)

Windowsで環境変数HOMEが定義されていれば上記より優先される。

ファイルは他人に読まれないようにする。

記述内容

machine  リポジトリホスト名
login    HTTP認証のユーザ名
password HTTP認証のパスワード

これを1セットとして、アクセスするサーバ分連ねていく

例)

リポジトリURLがhttp://example.jp/repos/git/~となっているとき

machine  example.jp
login    username
password userpass

Mercurial(hg)の場合

参考:HTTPS ユーザー認証の設定 / hg tip

ホームディレクトリにある設定ファイルにauthセクションを追加する

設定ファイルの位置

  • $HOME/.hgrc(Linux)
  • C:\Documents and Settings\ユーザ名\Mercurial.ini (Windows XP以前)
  • C:\Users\ユーザ名\Mercurial.ini (Windows Vista以降)

Windowsで環境変数HOMEが定義されていれば上記より優先される。

ファイルは他人に読まれないようにする。

記述内容

[auth]
 識別子.prefix   = リモートリポジトリのURLの接頭部分
 識別子.username = HTTP認証のユーザ名
 識別子.password = HTTP認証のパスワード

識別子は適当な名前をつける、これをアクセスするサーバ分連ねていく。

識別子.prefixにマッチするusernameとpasswordが認証に使われる。

例)

リポジトリURLがhttp://example.jp/repos/hg/~となっている場合、識別子とhogeとして

[auth]
hoge.prefix = http://example.jp/repos/hg/
hoge.username = username
hoge.password = userpass

オレオレ証明書とTortoiseGit/TortiseHg

リポジトリサーバにHTTPSでアクセスする際、自己認証局で発行した証明書を使ったSSLを利用する場合、証明書の検証に失敗してクローンできませんでした。その対応法。

1.自己認証局の証明書を登録する

  1. 適切な方法で自己認証局の証明書をPEM 形式で出力したものを用意する(ca.crt)
  2. ca.crtを適当な場所に設置する(今回は、C:\CAに設置。パス中に日本語が含まれないように。)

a. TortoiseGit

    1. 右クリック→「TortoiseGit」→「Settings(設定)」→TortoiseGitダイアログの左側「Git」→「Edit global .gitconfig(このユーザの設定を編集)」ボタン押下
    2. [http]セクションに
sslCAInfo = C:\\CA\\ca.crt

を追加

または、
「Edit systemwide gitconfig(全ユーザ共通の設定を編集)」ボタンを押下

sslCAinfo = /bin/curl-ca-bundle.crt

のように書かれているのを確認して、C:\Program Files\Git\binにある、curl-ca-bundle.crtにca.crtの中身を追記する

b. TortoiseHg

  1. TortoiseHg→Global Settings→「ファイルを開く」
  2. [web]セクションに
    cacerts=C:\\CA\\ca.crt

    を追加

2.証明書チェックを飛ばす

a. TortoiseGit

    1. TortoiseGit→Settings→Git→Config→「Edit global .gitconfig」ボタン押下
    2. [http]セクションに
      sslVerify = false

      を追加

b. TortoiseHg

クローン時にオプションの「Do not verify host certificate」をチェック

RedmineとSubversion・Git・Mercurialのリポジトリ(ともに同じCentOSサーバ上)の連携(リポジトリの作成とアクセス・認証)

Redmine上からSubversion,Git,Mercurialのリポジトリ作成ができ、公開したリポジトリにプロジェクトに所属したユーザであれば、Redmineのユーザアカウントでアクセスできるようになります。

Subversion,GitなどのツールやRedmineとアジャイル開発、継続的インテグレーションに便利な各種プラグインに加え、今回の連携設定などをまとめてインストールできるALMiniumというものがあります。

前提

  • OSがCentOS
  • Apacheをインストール済み
    (# yum install httpd)
  • Apacheの実行ユーザ名とグループ名はapache
  • Subversionとmod_dav_svnモジュールがインストール済み
    (# yum install subversion mod_dav_svn)
  • Gitインストール済み(# yum install git)
  • Mercurialインストール済み(# yum install mercurial)
  • Redmineをインストール済み
    (http://blog.redmine.jp/articles/redmine-1_2-installation_centos/)
  • redmineのDBはMySQLで同じサーバで稼働
  • redmineのインストールディレクトリを$REDMINE_ROOTとする
  • SVNリポジトリを格納する親ディレクトリを/var/www/repos/svnとする
  • GITリポジトリを格納する親ディレクトリを/var/www/repos/gitとする
  • Mercurial(Hg)リポジトリを格納する親ディレクトリを/var/www/repos/hgとする
  • http://example.jp/repos/svnがSVNリポジトリのURLとする
  • http://example.jp/repos/gitがGITリポジトリのURLとする
  • http://example.jp/repos/hgがHgリポジトリのURLとする

1.リポジトリの親フォルダの作成

# mkdir -p /var/www/repos/{svn,git,hg}
# chown -R apache /var/www/repos

2.SCM Repository Creation pluginのインストール

RedmineからSubversion・Git・Mercurialのリポジトリの作成ができるプラグイン

a). ダウンロード

http://projects.andriylesyuk.com/projects/redmine-svn/wiki/Installの横にあるダウンロードリンクからredmine_scm-0.2.0.tar.bz2をダウンロード

b). インストール

解凍としてできたredmine_scmをフォルダ丸ごと$REDMINE_ROOT/vendor/pluginsに移動

c). DBマイグレーション

$ rake db:migrate:plugins RAILS_ENV=production

d). プラグインの設定ファイルの追加

$cp $REDMINE_ROOT/vendor/plugins/redmine_scm/config/scm.yml $REDMINE_ROOT/config/scm.yml
$vi $REDMINE_ROOT/config/scm.yml

production:
  auto_create: false
  deny_delete: true
  svn:
    path: /var/www/repos/svn
    svnadmin: /usr/bin/svnadmin
    url: http://example.jp/repos/svn
  git:
    path: /var/www/repos/git
    git: /usr/bin/git
    options: --bare
    url: http://example.jp/repos/git
    update_server_info: true
    git_ext: true
  mercurial:
    path: /var/www/repos/hg
    hg: /usr/bin/hg
    url: http://example.jp/repos/hg

development:

※不要なSCM部分はカットする
deny_delete
リポジトリの削除を禁止するか
falseに設定するとプロジェクトの「設定」→「リポジトリ」に「削除」のリンクが現れる
削除するとリポジトリ情報リポジトリ自体も削除される
path
リポジトリの親ディレクトリ
この下に各プロジェクトのリポジトリが作成される
url
HTTPでアクセスする際のURLプレフィックス
リポジトリを作成した後、プロジェクトの「設定」→「リポジトリ」の画面にURLが表示される

e). Redmine再起動

# service httpd graceful
(Passengerを使用しているのでApacheの再起動で代用)

f). 「管理」→「プラグイン」「SCM Creator」が追加されているのを確認

g). 所属しているプロジェクト→設定→リポジトリと移動し、リポジトリを作成してみる

「バージョン管理システム」から「Subversion」を選択すると、
URLに親フォルダ+プロジェクト識別子が入力された状態になる
ログイン、パスワードは空のまま「Create new repository」を押すとURLの場所にリポジトリが作成される

3.各リポジトリのHTTPアクセスとRedmineの認証情報の連携

参考:http://www.redmine.org/projects/redmine/wiki/Repositories_access_control_with_apache_mod_dav_svn_and_mod_perl

a). 必要パッケージのインストール

# yum install mod_perl perl-DBI perl-Digest-SHA1 perl-DBD-MySQL

b). Redmine.pmにパッチを当てる(Git用)

SubversionのリポジトリにHTTPでアクセスする際、Redmineに付属しているRedmine.pmを使用して認証を行います。
Redmine.pmはSubversion用のものなので、http://www.redmine.org/issues/4905にあるパッチを当てることでGitリポジトリにHTTPでアクセスできるようになります。

# cd $REDMINE_ROOT/extra/
# cp Redmine.pm Redmine.pm.orig (バックアップのため)
# wget "http://www.redmine.org/attachments/download/5989/0001-merged-LeeF-s-patch-with-Michael-Fox-s-security-fix-redminetrunk.patch" (上記URLの最新のパッチ)
# patch Redmine.pm < 0001-merged-LeeF-s-patch-with-Michael-Fox-s-security-fix-redminetrunk.patch

c). Redmine.pmをperlのインクルードパスが通っている場所に設置する

設置例:

  • /etc/httpdにApacheディレクトリを作成し、その中にAuthnディレクトリを作成しその中にRedmine.pmを入れる
  • /usr/lib/perl5/Apache/Authn/にRedmine.pmを入れる(ディレクトリがない場合は作成する)

d). hgweb.cgiの設定(Mercurial用)

#cp /usr/share/doc/mercurial-x.x.x/hgweb.cgi /var/www/repos/hg/  (x.x.xはインストールされたmercurialのバージョンです。)

#vi /var/www/repos/hg/hgweb.config
[paths]
/=/var/www/repos/hg/**

[web]
allow_push = *
allowbz2 = yes
allowgz = yes
allowzip = yes

#vi /var/www/repos/hg/hgweb.cgi
7行目
config = "/path/to/repo/or/config"
↓
config = "hgweb.config"

e). Apacheの設定

# vi /etc/httpd/conf.d/redmine.conf
  PerlLoadModule Apache::Authn::Redmine

  # Subversion
  <Location /repos/svn>
    DAV svn
    SVNParentPath "/var/www/repos/svn"

    AuthType Basic
    AuthName "Redmine SVN Repository"
    Require valid-user

    PerlAccessHandler Apache::Authn::Redmine::access_handler
    PerlAuthenHandler Apache::Authn::Redmine::authen_handler

    ## for mysql
    RedmineDSN "DBI:mysql:database=redmine_db;host=localhost"
    RedmineDbUser "redmine_user"
    RedmineDbPass "redmine_pass"
  </Location>

  # Git
  SetEnv GIT_PROJECT_ROOT /var/www/repos/git
  SetEnv GIT_HTTP_EXPORT_ALL
  ScriptAlias /repos/git/ /usr/libexec/git-core/git-http-backend/
  <Location /repos/git>
    AuthType Basic
    AuthName "Redmine Git Repository"
    Require valid-user

    PerlAccessHandler Apache::Authn::Redmine::access_handler
    PerlAuthenHandler Apache::Authn::Redmine::authen_handler

    RedmineDSN "DBI:mysql:database=redmine_db;host=localhost"
    RedmineDbUser "redmine_user"
    RedmineDbPass "redmine_pass"
    RedmineGitSmartHttp yes
  </Location>

  # Mercurial
  ScriptAliasMatch ^/repos/hg(.*)  /var/www/repos/hg/hgweb.cgi/$1
  <Location /repos/hg>
    AuthType Basic
    AuthName "Redmine Mercurial Repository"
    Require valid-user

    PerlAccessHandler Apache::Authn::Redmine::access_handler
    PerlAuthenHandler Apache::Authn::Redmine::authen_handler
    RedmineDSN "DBI:mysql:database=redmine_db;host=localhost"
    RedmineDbUser "redmine_user"
    RedmineDbPass "redmine_pass"
  </Location>

データベース名、データベースアクセスユーザ名・パスワードは適宜変更して、Apache再起動

# service httpd configtest
# service httpd graceful

f). 認証が有効になっているか実際にアクセスする

  • svn ls / git clone / hg clone
  • TortoiseSVN・TortoiseGit・TortoiseHgなどを使用してアクセス

Redmineユーザ名とパスワードでアクセスできるか確認する

Shibuya.trac 分散バージョン管理勉強会

URL:http://kokucheese.com/event/index/6329/

場所:江東区 古石場文化センター 2階 第1,2研修室

「分散バージョン管理システムってなんなん?」(おかもとさん)

TracLightning 3.0からアジャイル対応

バージョン管理の変遷

CSV:共有モデルのファイル管理

SVN:アトミックなコミット(コミットされるかされないか、リビジョンごとの管理が可能に)

DVCS(分散バージョン管理):ブランチ・マージモデル、ローカルコミット、ローカルでのdiffやログ参照、ログのリファクタリング、マージトラッキング

「GitとHudsonによるきれいなリポジトリの作り方」(bleis さん)

集中型と比較した分散型の利点

  • 集中型
    • 間違った操作が全体に影響
    • 気後れしてしまう
  • 分散型
    • 自由なコミット
    • 作業のやり直しが可能

リポジトリとWCの関係

  • 集中型
    1つのリポジトリに複数ののワーキングコピー
  • 分散型
    1つのリポジトリに1つのワーキングコピー

=>意外と分散型のほうがシンプル

分散型は更新先を複数持てる。

きれいなリポジトリ

DVCSでも解決できない問題があるので、きれいなリポジトリを構成する必要がある

きれいなリポジトリ=最新版がいつでもビルド可能なリポジトリ

実現するには?

CIの導入
→リポジトリが更新されるたびにビルドを走らせることにより、素早いフィードバックを得ることができる

しかしフィードバックだけでは足りない=>ビルドが壊れるとその状態が取得できてしまう。

そこでDVCSを利用する。2つの利用方法

  • ブランチを分割
  • リポジトリを分割
    開発者ごとにリポジトリ(プライベートブランチ)
    きれいなリポジトリ(セントラルブランチ)

ブランチ分割法

hookでmasterブランチにpushできないようにする

プライベートブランチの更新をhookしてビルド

hudsonのgitプラグインの設定で簡単に設定できる

リポジトリ分割法

セントラルリポジトリは外部から取得専用にする

プライベートリポジトリの更新をhookしてビルド

開発者が増える際の設定が多い

まとめ:DVCSとCIできれいなリポジトリを。実現方法は複数ある。

「TracLightningとTortoiseHgのゆるふわな連携」(ゆかわさん)

Mercurial

  • 単機能(1コマンド1機能)
  • 拡張機能が豊富
  • 差分で履歴を管理(Gitはスナップショット)
  • 4種類のブランチ
    →名無しブランチというものがある

拡張機能をがしがし使う必要がある

「git-svn使ってみる?」(riskさん)

git-svnの基本的な説明

git-svnとはsvnとgitの中継

git-svnが利用可能なソフト(windows)

msysgit ・ cygwin

「Mercurialで別オリジンのリポジトリ間で同期を取る運用の仕方について」(monjudohさん)

Mercurialで別オリジンのリポジトリ間の同期を取る運用の仕方について – 文殊堂

LT1. 「Gitでの歴史の改変方法の紹介」(神速さん)

改変を実際にデモ

git add -p

複数の変更から一部選択してコミット

git rebase -i

rebaseする際にそれまでコミットした内容を再度編集でき、改変もできる

LT2. 「SVNユーザのためのBazaarガイド」(iwataさん)

Bazaarの紹介

Bazaarをおすすめするケース

  • デザイナさんとかにVCSを使って欲しい時
  • 日本語ファイル名を使いたい時
    (SVNと同じレベルで)
  • SVNを使いながら段階的にDVCSを利用したい
  • レベルの低い人

Bazaarをおすすめできないケース

  • VSインテグレーション機能が必要なとき

コンセプト

  • 誰でも使えるバージョン管理
  • better SVN

リモートリポジトリからチェックアウトするとリモートリポジトリとバインドすることができる
→ローカルリポジトリにコミットするとリモートにも反映される

LT3. 「Hudsonからみるバージョン管理」(さぼてんさん)

2011年2月25日にhudson勉強会やります。

HudsonでDVCSをつかうと

  • ヒエラルキー構造が持てる
  • pre tested commit
    コミット前のテストが可能

より柔軟な開発環境を構築可能

LT4. 「ビューティフルなデバッグの話」(かわにしさん)
「beautiful code」、「why programs fail」より「差分デバッグ」

git bisect

テストプログラムを作成して、どのリビジョンからテストが失敗するかを二分検索で見付け出してくれる。

後説

今日のメモ:
大福ロシアンルーレット(いちご=はずれ、バナナ、栗、わさび)の大当たりである、「わさび入り大福」は4つの中でいちばん値段が高い