ラベル git の投稿を表示しています。 すべての投稿を表示
ラベル git の投稿を表示しています。 すべての投稿を表示

2013年6月4日火曜日

パッチを投稿しよう!

オープンソースをダウンロードしてきて、動かしたり、改造したりしているうちに、
バグ修正や、新機能などをコミュニティへフィードバックしたくなってくるかもしれません。

自分は、最近 U-Boot によくパッチを投稿しています。

以下は、U-Boot にパッチを送り始めた時に自分がやった時の一連の流れをまとめておきます。
U-Boot は基本的に、Linux Kernel と同じ開発スタイルを踏襲しているので、それなりに参考になるかと。

ML に参加する


たいていは、パッチはメーリングリストに投稿するようになっていると思います。
なので、まずはメーリングリストを購読します。
やり方は、開発のコミュニティのページに書いてあります。

git send-email を使えるようにする


これについては、前回、git send-email でまとめておきました。

投稿用のパッチを作る


パッチの作り方は、コミュニティのページに説明があると思います。
ログの入れ方とか、いろいろと取り決めがあるので、じっくり読みます。

Linux Kernel を始め、いくつかのコミュニティでは sign-off という制度があります。
sign-off とは、このパッチはオープンソースとして提供しても大丈夫なものですよ、ということを私が証明します、という意味だと、自分なりに理解しています。

自分が一から書いたパッチであれば当然問題はないです。
パッチの中に、別の GPL のコードを含んでいても問題はないです。
一方、GPL とは相容れないライセンスのコードを含んでいたら、NGです。

コミット時に

$ git commit -s

のようにすれば、ログに Signed-off-by: ~ という行が追加されます。

パッチ生成時に

$ git format-patch -s

のようにしてもいいですが、忘れないように commit 時にやっておくのがいいように思います。

パッチ送る


前回 はとりあえず練習で自分宛に送りましたが、いよいよ今度は本物のメーリングリストに送ります。
初めてパッチを送信する時は、結構ドキドキするものです。

毎回送信先のアドレスを聞いてこないように

$ git config sendemail.to mailing-list

の設定をします。プロジェクトごとに送信先が違うはずなので、--global オプションは付けません。そうすると、この設定はリポジトリごとの .git/config に書き込まれます。

git send-email で送ります。

初回の投稿の場合、 Message-ID to be used as In-Reply-To for the first email?
については、そのまま [Return] でよいです。

自分のパッチが受け付けられたことを確認する


送信するのが初めての場合、すぐにメーリングリストに配信されずに

Your message to <...> awaits moderator approval

みたいな返信が来ることがあります。

一瞬、なんじゃこりゃ?みたいに思うかもしれませんが、心配いりません。

たぶん、スパム対策のために、初めて投稿してくる人に対しては、まともな内容かどうか審査があるんだと思います。
問題なければ、数時間後にはメーリングリストに配信されてくると思います。

2回目からは、すぐにメーリングリストに配信されると思います。

パッチのステータス管理に Patchwork http://patchwork.ozlabs.org/ というシステムを使っているプロジェクトもあります。
自分のパッチもステータス New として登録されていることを確認します。

レビューに対し、返答する


自分のパッチに対し、フィードバックしてくれる人があるかもしれません。
これに対しては、 git send-email ではなくて、普段使っているメーラーで、ごく普通に返信します。

修正版のパッチを再投稿する


投稿したパッチがそのまま Accepted になれば万々歳です。
Rejected になれば、基本的にはそこで終わりです。
Changes Requested になった場合は、指摘された部分を修正することで、Accepted になる可能性が高いです。

この場合、元のスレッドに対して修正版のパッチを返信するのではありません。
(Changes Requested になれば、そのスレッドは基本的に終わりです。)

新しいパッチファイルを作り直し、投稿します。

修正をしたら、

$ git commit --amend

でコミットを作り直します。

そして、今度はVersion 2のパッチであることがわかるようにタイトルに入れます。
以下のようにすれば git がやってくれます。

$ git format-patch --subject-prefix="PATCH v2" HEAD^

さらに、前回のパッチからどこが変わったのかをパッチの中に書き込みます。

$ nano 0001-blabla-blablabla


Signed-off-by: ~ の直後に

---

という行があって、この直後にコメントを入れることができます。
これは git のコミットログには反映されません。
例えば、以下のような感じです。

Signed-off-by: Masahiro Yamada <abc@xyz.com>
---

Changes for v2:
   - Fix hogehoge

git send-email で送りますが、今度は
Message-ID to be used as In-Reply-To for the first email?
のところに、前回のバージョンのパッチの Message-ID(前回のメールのヘッダを見れば書いてある)を入力します。
これによって、スレッドで関連付けられます。

2013年6月3日月曜日

git send-email

git には send-email というメールを送信するコマンドがあります。
ただし、普通のメールを送信するのに使うというより、パッチを送る用途に使います。

パッチを自分のメーラーに貼りつけて送信してもいいのですが、
メーラーによっては、長い行を勝手に改行してくれたりして、パッチが破壊される可能性もあります。

リポジトリ管理に git を使っているプロジェクトだと、
git format-pach でパッチ生成 ⇒ git send-email で送信
とするのが手順的にも楽です。
オープンソースの開発にコントリビュートするのに必須ですね。

セットアップについてメモ。

git-core を入れただけでは、 git send-email コマンドはまだ入っていないかもしれません。

Ubuntu の場合は

# apt-get install git-email

でインストールできます。
(他のディストリビューション未確認)


まずは練習のために、自分宛に、何か送ってみましょう。

なんでもいいので、git リポジトリでパッチを生成します。
$ git format-patch HEAD^
0001-blabla-blablabla.patch
今生成したパッチを送信してみます。
$ git send-email 0001-blabla-blablabla.patch
0001-blabla-blablabla.patch
Who should the emails appear to be from? [Masahiro Yamada <abc@xyz.com>]
Emails will be sent from: Masahiro Yamada <abc@xyz.com>
Who should the emails be sent to? abc@xyz.com
Message-ID to be used as In-Reply-To for the first email?
みたいな感じになります。

Who should the emails appear to be from?
というのは、メールの送信元 (From: フィールド) のことです。
基本的にコミットログからとってくれるので、それでよければそのまま [Return] を押します。

Who should the emails be sent to?
は送り先です。
今は練習なので、自分のメールアドレスを入れます。

Message-ID to be used as In-Reply-To for the first email?
は、今から送るメールが、何か別のメールに対する返信であるときに、引用元の Message-ID を入れておくと、メーラーなどがスレッドの分類などに使ってくれます。
今は、新規メールですので、そのまま [Return] でよいです。

最後に

Send this email? ([y]es|[n]o|[q]uit|[a]ll): y

と聞いてきますので、 間違いがないか確認して、 y[Return]
とします。

ローカルで sendmail 系のサービスが動いていれば、これで送信できちゃいます。
自分は postfix を入れています。postfix の設定は以前、git push でメールをとばす で簡単にまとめた。

postfix など入れてないケースが多いでしょうが、その場合は SMTPサーバーを指定しないといけません。

$ git config --global sendemail.smtpserver server_address
で設定します。必要であれば
$ git config --global smtpserverport port_number
でポート番号を設定します。

プロジェクトごとに別の SMTP サーバーを使う必要は普通はないので、--global オプションを付けます。すると、この設定は ~/.gitconfig に書き込まれます。


特に Gmail を使って送信する方法もメモっておきます。
GitTips に書いてありました。

~/.gitconfig/に以下を追加
[sendemail]
        smtpencryption = tls
        smtpserver = smtp.gmail.com
        smtpuser = your_account@gmail.com
        smtpserverport = 587
を追加して、 git send-email を実行すると Password を聞いてくるので、Gmail のパスワードを入力すると送信できる。

この場合の注意点は、git send-email での表示と無関係に、メールの From フィールドを
smtpuser = your_account@gmail.com で指定したアドレスに強制的に置き換えてしまうことです。

2013年1月10日木曜日

GitHub 覚え書き

2012年10月9日火曜日

git-svn

2012年10月2日火曜日

git daemon

git daemon の設定方法をメモっておきます。

Ubuntu と RHEL/CentOS 両方やってみましたが、やり方がちょっと違いますので、分けて説明します。

まずは Ubuntu でのやり方:
Ubuntu 12.04.1 LTSで試しました。

$ sudo apt-get install git-daemon-run
$ sudo sv start git-daemon

でできた。

あとは、export したいgit リポジトリの下に git-daemon-export-ok という空ファイルを作っておく。

Ubuntu だと sv というのがあるんですね。RHELにはないです。
この辺の事情は知りません。。

man sv を読むと、デフォルトで /etc/service の下をサーチするとある。
確かに
/etc/service/git-daemon
というのがある。

これは
/etc/sv/git-daemon ディレクトリへのシンボリックリンクになっている。

/etc/sv/git-daemon/run の内容は以下のようになっていた。


#!/bin/sh
exec 2>&1
echo 'git-daemon starting.'
exec chpst -ugitdaemon \
  "$(git --exec-path)"/git-daemon --verbose --reuseaddr \
    --base-path=/var/cache /var/cache/git


Debian 系は /var/cache/git の下にリポジトリがあるのを期待している。
なので、 gitweb や git-daemon などの etc ファイルをいちいち書き変えるよりも、
/var/cache/git から本当のリポジトリ置き場へシンボリックリンクを貼っておくのがよいと思う。

/var/cache/git に直にリポジトリを置いてもいいんですが、FHS的には、/var/cache/ 以下はアプリケーションのキャッシュとして使われるということなので、ちょっと気持ち悪い気がする。

--base-path=/var/cache は アクセスするときに、パスの先頭から /var/cache をはぎ取るという意味だから、
/var/cache/git/repo.git をクローンする場合、
$ git clone git://hostname/git/repo.git
みたいな感じでアクセスすればよい。


引き続いて、RHEL/CentOS でのやり方:
RHEL 6.3で試しました。

# yum install git-daemon
でインストールする。
xinetd もついでに依存関係で入る。

/etc/xinetd.d/git の設定ファイルができているので、
ちょこっと編集します。


# default: off
# description: The git dæmon allows git repositories to be exported using \
#       the git:// protocol.

service git
{
#        disable         = yes    ← コメントアウト
        disable         = no      ← 追加
        socket_type     = stream
        wait            = no
        user            = nobody
        server          = /usr/libexec/git-core/git-daemon
#        server_args     = --base-path=/var/lib/git --export-all --user-path=public_git --syslog --inetd --verbose     ←コメントアウト
        server_args     = --base-path=/var --export-all --user-path=public_git --syslog --inetd --verbose /var/git    ←追加
        log_on_failure  += USERID
}


disable を noにして、server_args の部分を書き換えています。

git clone git://my.git.server/git/hoge.git
で /var/git/hoge.git へアクセスするようになります。

あとは
# service xinetd restart
とします。

git daemon はデフォルト 9418番ポートを listen するので、
ファイアウォールを使っている場合は、9418/tcp を開ける。

2012年10月1日月曜日

git repogitory 自動バックアップ

git の repogitory は絶対に失ってはならない、最重要データの一つである。

そこで、独立した複数台のPCに常にバックアップを取ることを考えた。
cron を使い、定期的に他のマシンへ git push するようにする。

サーバーへは普通は ssh で接続するようになっているケースが多い。
自動バックアップのためにはパスワードなしで ssh 接続できないといけないので、
前回の「公開鍵暗号による ssh接続」の設定を済ませておく。
(秘密鍵を取り出すパスフレーズは空にしておく。)

そして、
$ crontab -e
で定期的に実行したいコマンドを記入する。
記入フォーマットは左のカラムから分、時、日、月、曜日、コマンドとなっている。
例えば、毎時55分になったら、 /var/git/main_repo.git の master ブランチを
backup_server マシン (アカウント名 = my_account) の ~/backup/backup_repo.git へ
pushしたい場合以下のようになる。

55 * * * * cd /var/git/main_repo.git; git push my_account@backup_server:~/backup/backup_repo.git master

↑ブラウザの都合で複数行に見えるかもしれないけど、1行です。


やりながらふと思ったが、
メインのマシンの方で、git daemon を動かしておいて、
バックアップサーバの方から定期的に git pull git://〜
するのでも良かった。

gut push でメールをとばす

git push でリポジトリが更新されたときに、commitの内容をメールで送信する方法。


ディストリビューションにもよるが、メール送信スクリプトは
/usr/share/git-core/contrib/hooks/post-receive-email
に普通インストールされていると思うので、これをそのまま使うこととする。

送信には sendmail を使用しているので、まずは sendmail ができるようにならないといけない。


MTA の設定はあまり詳しくないが、、、
とりあえずUbuntu でやってみた。

$ sudo apt-get install postfix
でインストール。
途中で選択肢が出てくるので、「インターネットサイト」を選択。

自宅のマシン場合、特に設定なしでも、そのまま使えた。
以下でちゃんとメールが届けばOK。

$ sendmail my.address@gmail.com
To: my.address@gmail.com
From: my.address@gmail.com
Subject: test
test
.


会社の場合、ファイアウォールの問題で、このままだと配送できなかったので、relayhostを設定。

/etc/postfix/main.cf を編集し、
relayhost のところに中継サーバーのIPアドレスを指定する。
IPアドレスで指定しないといけないみたいなので、
会社からこれを使え、と言われているSMTPサーバ名から nslookup で引く。

$ nslookup my.office.smtp.server
で Address : xxx.yyy.zzz.www
みたいにIPアドレスが返ってくるので、
relayhost = xxx.yyy.zzz.www
と指定するとOK。



sendmail が動くようになったので、続いて git の設定。

/usr/share/git-core/contrib/hooks/post-receive-email
にやり方が全部書いてあるので、この通りやるだけですが。。

post-receive-email に実行権限を与える
$ sudo chmod a+x /usr/share/git-core/contrib/hooks/post-receive-email

設定したいgit リポジトリへ移動
$ cd  /my/git/repogitory.git/hooks

post-receive-email へ post-receive という名前でシンボリックリンクをはる。
$ ln -s /usr/share/git-core/contrib/hooks/post-receive-email post-receive

送りつけたい宛先を config に設定
$ git config hooks.mailinglist "address@you.want.to.send"

とりあえずこれで送信されます。

あと、お好みでやっておく設定

メールのタイトルが 「UNNAMED PROJECT」になっているので、description にプロジェクト名を記載。

送信元アドレス指定
$ git config hooks.envelopesender do_not_reply_this@foo.org

メール最大行数を指定
$ git config hooks.emailmaxlines 500


2012年1月30日月曜日

gitweb を使う

2012年1月27日金曜日

git 共用リポジトリ作成

2012年1月25日水曜日

repo で proxyを乗り越える