2014年1月31日金曜日

Gitのブランチに別名をつける(symbolic-ref)

Gitのブランチに別名をつける方法を紹介します。

やり方は、
% git symbolic-ref refs/heads/<新しい名前> refs/heads/<参照先>
です。

以下解説。

GitやSubversionのリポジトリを(gitやgit-svnで)ミラーしていると、特定のブランチに対して自分で別名を付けたくなることがあります。

例えば、あるサービスXを構成するモジュールがA〜Cの3つ、あるいはそれ以上あり、Xのあるリリースに必要な各モジュールのブランチ名が、それぞれのリポジトリでちぐはぐな場合などです。A〜Cの作成チームが異なると、こういうことはよくあります。

ここで、Xのリリース release1.0 に向けて必要な各モジュールの手元のミラーリポジトリと必要なブランチをそれぞれ

モジュールリポジトリミラー必要なブランチ
A/var/lib/git/mod_a.gitmaint1.3
B/var/lib/git/mod_b.gitdevel4
C/var/lib/git/mod_c.gitmasteだ

とします。スクリプトなどからの利用を考えると、これらのブランチをすべて x-release1.0 というブランチ名で指定できると便利です(Xのリリースが複数ある場合など特に)。そこで

% git --git-dir=/var/lib/git/mod_a.git symbolic-ref refs/heads/x-release1.0 refs/heads/maint1.3
% git --git-dir=/var/lib/git/mod_b.git symbolic-ref refs/heads/x-release1.0 refs/heads/devel4
% git --git-dir=/var/lib/git/mod_c.git symbolic-ref refs/heads/x-release1.0 refs/heads/master

を実行すれば、全てのモジュールに対して x-release1.0 というブランチ名で必要なブランチを指定できるようになります。

単純に git branch で別のブランチを切るだけだと、参照先のブランチが更新された場合に追従できず、いつまでも同じコミットを指すことになってしまいます。symbolic-refを付けてあげることにより、参照先のブランチが変化しても、常に同じコミットを参照できます。

いくつか注意点があります。

  • 引数はGitディレクトリ内の相対パスなので、実際のところリポジトリ内の何処にでも作れます(作れてしまいます)。refs/heads以外の場所に作ると予期せぬ動作をしたりする可能性があります。
  • symbolic-refを作ったリポジトリ以外の場所、例えばpushやpullした先のリポジトリでは普通のブランチに見えます。ただし、pullした場所などでsymbolic-refなブランチにコミットしたあと元のリポジトリにプッシュすると、参照先も一緒に更新されたように見えます。つまり、symbolic-refを作ったリポジトリ内ではいつもsymblic-refとしての性質が有効です。pullした側のリポジトリでは、pushでリモートブランチが更新されるのはpushしたブランチだけなので、push後すぐにfetchしないと混乱するかもしれません。
  • symbolic-refは本来、HEADをカレントブランチのtipとして参照するためのものです。このような利用法がいつまでも有効かどうかはわかりません(HEADの仕組みがある限りたぶん大丈夫ですが)。
詳細は git-symbolic-ref(1) を参照してください。

0 件のコメント:

コメントを投稿