JP6024559B2 - プログラムおよびバージョン管理方法 - Google Patents

プログラムおよびバージョン管理方法 Download PDF

Info

Publication number
JP6024559B2
JP6024559B2 JP2013067790A JP2013067790A JP6024559B2 JP 6024559 B2 JP6024559 B2 JP 6024559B2 JP 2013067790 A JP2013067790 A JP 2013067790A JP 2013067790 A JP2013067790 A JP 2013067790A JP 6024559 B2 JP6024559 B2 JP 6024559B2
Authority
JP
Japan
Prior art keywords
commit
tree
data
merge
branch
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2013067790A
Other languages
English (en)
Other versions
JP2014191672A (ja
Inventor
智裕 大嶽
智裕 大嶽
小高 敏裕
敏裕 小高
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2013067790A priority Critical patent/JP6024559B2/ja
Priority to US14/177,999 priority patent/US9646030B2/en
Priority to EP14155734.8A priority patent/EP2784665B1/en
Publication of JP2014191672A publication Critical patent/JP2014191672A/ja
Application granted granted Critical
Publication of JP6024559B2 publication Critical patent/JP6024559B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/21Design, administration or maintenance of databases
    • G06F16/219Managing data history or versioning
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Computer Security & Cryptography (AREA)
  • Data Mining & Analysis (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Stored Programmes (AREA)

Description

本発明はプログラムおよびバージョン管理方法に関する。
現在、ソフトウェア開発などのプロジェクトにおいては、ソースコードや設計仕様書などの成果物のバージョンを管理するためにバージョン管理システムが利用されることがある。バージョン管理システムは、複数のバージョンのデータを、リポジトリと呼ばれるデータベースに格納して管理する。バージョン管理システムを利用することで、データの更新の経緯を確認することが容易となり、また、最近行った更新を取り消してデータの状態を過去のバージョンに戻すことも可能となる。バージョン管理システムの例としては、Git,Subversion,Mercurialなどが挙げられる。
バージョン管理システムを利用すると、複数のバージョン系列についての作業が並行して進行するプロジェクトを管理することも容易となる。例えば、あるソフトウェアに対して、既存の機能を効率的に実行できるように修正する作業と、新たな機能を追加する作業とを並行して行うことがある。この場合、バージョン管理システムは、2つのバージョン系列(例えば、バージョン1.x系とバージョン2.x系)のデータを区別してリポジトリに格納する。各バージョン系列は「ブランチ」と呼ばれることがある。
複数のブランチは後でマージされることがある。例えば、既存の機能を効率化したソースコードと新たな機能を追加したソースコードとをマージして、両方のブランチの作業を反映した最新状態のソフトウェアをテストしたいことがある。この場合、例えば、バージョン管理システムは、ブランチが分岐した時点の過去のソースコードを基準として、マージする一方のソースコードの修正内容と他方のソースコードの修正内容とを特定する。そして、バージョン管理システムは、修正内容の衝突がないことを確認して、両方のブランチの修正内容が反映されたソースコードをマージ結果として生成する。
ところで、バージョン管理システムの中には、バージョン間の関係や更新日時やデータ作成者などの書誌情報と、実体データとを分離して管理するものがある。例えば、Gitでは、書誌情報を含む「コミット」、ファイルや他のディレクトリの入れ物としてのディレクトリに相当する「ツリー」、ファイル内容を含む「ブロブ」という3種類のオブジェクトがリポジトリに格納される。各オブジェクトには、リポジトリ内で一意に識別できるように、そのオブジェクトが有する情報から算出される識別子が付与される。
このように、書誌情報と実体データとを分離して管理することで、同一内容のデータが重複してリポジトリに格納されるのを抑制できる。例えば、あるバージョンにおける一のファイルと別のバージョンにおける一のファイルとが、同一内容であるとする。この場合、Gitではファイルに相当するブロブの識別子が同じになるため、リポジトリには1つのブロブが格納されて2つのバージョンからそのブロブが参照される。
また、書誌情報と実体データとを分離して管理することで、バージョン間の関係などの書誌情報を後から編集することも容易となる。例えば、あるバージョンで機能Aが修正され、その次のバージョンで更に機能Bが修正されたとする。その後、プロジェクト管理の都合上、機能A,Bの修正順序が逆になるように修正経緯を変更したいことがある。そこで、例えば、Gitではユーザがコミットの順序を入れ替えることができる。このとき、後者のバージョンで機能A,Bの両方が修正されていることに変わりはないため、入れ替え後の末尾のコミットが参照するツリーは変化しない。また、例えば、Gitではユーザが複数のコミットを統合することもできる。このとき、統合後のコミットが参照するツリーは、統合対象の末尾のコミットが参照していたツリーと一致する。
なお、バージョン管理に関して、ソースプログラムのリリース時における修正内容の取り込みミスおよび取り込み漏れを防止するバージョン管理方法が提案されている。このバージョン管理方法では、複数のソースプログラムの改造が並行して行われるとき、先に完了した改造についてバージョンや修正情報をバージョン管理テーブル記録しておく。そして、後に改造が完了したソースプログラムをリリースするとき、バージョン管理テーブルに記録された修正情報をマージしてそのソースプログラムに取り込む。
特開平9−97171号公報
プロジェクトの進行形態として、複数のブランチの作業を進めながら、バージョン管理システムを用いてそれら複数のブランチを一時的にマージして最新状態の成果物を確認するという形態が考えられる。例えば、複数のブランチの少なくとも一部でソースコードを修正することと、それら複数のブランチをマージして生成される最新状態のソースコードをテストすることとを、繰り返しながらソフトウェア開発を進めることが考えられる。
このとき、複数のブランチをマージする毎にそれらのブランチが分岐した時点を基準にして修正内容を抽出していると、修正量が多くなるにつれてマージ処理の負荷が高くなってしまう。そこで、バージョン管理システムは、過去のマージ結果を記憶しておき、過去のマージ結果とそれ以降の修正内容とから新たなマージ結果を生成するようにすることが考えられる。複数のブランチをマージするにあたりどのような過去のマージ結果を利用することができるかは、リポジトリに格納された書誌情報に基づいて(例えば、Gitの場合はコミットの集合が示すコミットグラフを用いて)検索することが可能である。
しかし、前述のように、バージョン管理システムの中には、ユーザが書誌情報を編集できるものがある。マージが行われた後に書誌情報が編集されてしまうと、編集前の書誌情報と編集後の書誌情報との間の同一性が失われるため、再びマージを行うときにその過去のマージ結果を見つけることが容易でなかったという問題がある。例えば、Gitではコミットの修正(コミットの入れ替えや統合などコミット間の関係が変化する場合を含む)が行われると、参照するツリーが変化しなくてもそのコミットの識別子が変化する。よって、コミットが修正されてしまうと、どのコミットを対象として過去にマージが行われたかをコミットグラフのみから検索することが難しかった。
そこで、1つの側面では、本発明は、複数のブランチのマージを効率化することができるプログラムおよびバージョン管理方法を提供することを目的とする。
1つの態様では、コンピュータに以下の処理を実行させるプログラムが提供される。コンピュータは、それぞれが複数のバージョンのデータの何れかを参照しており自ノードが有する情報に応じた識別子が付与される複数のノードを含む、バージョン間の関係を示すバージョン管理グラフに対して、既存のノードが有する情報を編集することを許容する。コンピュータは、バージョン管理グラフに含まれる第1のブランチと第2のブランチとをマージするとき、過去に行われたマージについて2以上のバージョンのデータとマージ結果のデータとの対応関係を示す履歴情報に基づいて、第1のブランチに含まれるノードが参照する第1のバージョンのデータと第2のブランチに含まれるノードが参照する第2のバージョンのデータとから生成された過去のマージ結果のデータを検索する。コンピュータは、検索された過去のマージ結果のデータを用いて、第1のブランチと第2のブランチとをマージしたときの新たなマージ結果のデータを生成する。
また、1つの態様では、コンピュータが実行するバージョン管理方法が提供される。
1つの側面では、複数のブランチのマージを効率化することができる。
第1の実施の形態の情報処理装置を示す図である。 情報処理装置のハードウェア例を示すブロック図である。 リポジトリに格納されるオブジェクトの構造例を示す図である。 コミットとツリーとブロブの間の参照関係の例を示す図である。 ブランチのマージ例を示す図である。 コミットに対するリベース処理の例を示す図である。 過去のマージ結果を利用した第1のマージ例を示す図である。 過去のマージ結果を利用した第2のマージ例を示す図である。 第2の実施の形態の情報処理装置の機能例を示すブロック図である。 マージ履歴テーブルの例を示す図である。 第2の実施の形態のマージ処理の手順例を示すフローチャートである。 過去のマージ結果を利用した第3のマージ例を示す図である。 サブマージ履歴テーブルの例を示す図である。 第3の実施の形態のマージ処理の手順例を示すフローチャートである。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理装置を示す図である。
情報処理装置10は、プロジェクトで作成される成果物のバージョンを管理する。例えば、情報処理装置10は、ソフトウェア開発プロジェクトで作成されるソースコードやその他の文書(例えば、設計仕様書など)のバージョンを管理する。情報処理装置10は、例えば、コンピュータを用いて実現できる。情報処理装置10は、ユーザが操作する端末装置でもよいし、複数の端末装置からアクセスされるサーバ装置でもよい。
情報処理装置10は、プロセッサ11およびメモリ12を有する。プロセッサ11は、以下に説明するブランチのマージを実行する。プロセッサ11は、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)などを含んでもよい。例えば、プロセッサ11はメモリ12に記憶されたプログラムを実行する。また、プロセッサ11は、複数のプロセッサを包含する「マルチプロセッサ」であってもよい。メモリ12は、バージョン管理グラフ13および履歴情報14を記憶する。メモリ12は、例えば、RAM(Random Access Memory)などの主記憶部である。ただし、HDD(Hard Disk Drive)やフラッシュメモリなどの補助記憶部を「メモリ」と呼んでもよい。
バージョン管理グラフ13は、バージョン間の関係を示すグラフであり、複数のノードを含む。各ノードは、複数のバージョンのデータの何れかへの参照や、他のバージョンに対応する他のノードとの関係(例えば、当該バージョンの元になった親バージョンに対応する親ノードへの参照)などの情報を有する。各ノードには、当該ノードが有する情報のハッシュ値など、当該ノードが有する情報に応じた識別子が付与される。バージョン管理グラフ13は、並行して作業が進められるブランチ13a,13bを含む。
一例として、バージョン管理グラフ13はノードA,B,Cを含む。ノードAは、第1のバージョンに対応し、データaを参照する。ノードBは、第1のバージョンに基づいて作成された第2のバージョンに対応し、データaを修正することで得られたデータbを参照する。ノードCは、第1のバージョンに基づいて作成されて第2のバージョンと併存する第3のバージョンに対応し、データaを修正することで得られたデータcを参照する。ノードA,Bはブランチ13aに属し、ノードCはブランチ13bに属する。なお、ノードA,B,Cが参照するデータa,b,cは、情報処理装置10に記憶されていてもよいし、情報処理装置10の外部の記憶装置に記憶されていてもよい。
ここで、プロセッサ11は、バージョン管理グラフ13に含まれるブランチ13a,13bをマージする。ブランチ13a,13bのマージは、ユーザからのマージ命令の入力に応じて行われ得る。例えば、プロセッサ11は、ブランチ13aの末尾のノードBが参照するデータbと、ブランチ13bの末尾のノードCが参照するデータcとから、マージ結果のデータxを生成する。生成したデータxは、以下に説明するように後で利用されることがあるため、データa,b,cと同様にリポジトリに保存しておく。また、プロセッサ11は、マージした2以上のバージョンのデータとマージ結果のデータとの対応関係を履歴情報14に記録しておく。例えば、プロセッサ11は、マージしたデータb,cの識別子とマージ結果であるデータxの識別子とを対応付けて記録する。
次に、プロセッサ11は、バージョン管理グラフ13に対して、既存のノードが有する情報を編集することを許容する。ノードが有する情報の編集には、更新日時やデータ作成者の変更などグラフ構造が変化しない編集が含まれてもよく、ノードの入れ替えや統合などグラフ構造が変化する編集が含まれてもよい。ノードの情報が編集されると、そのノードの識別子は変化する一方、そのノードが参照するデータは変化しない可能性がある。一例として、ブランチ13bに属するノードCの情報が編集されて、ノードCがノードC+に変化する。ただし、ノードC+はノードCと同様にデータcを参照する。
また、前回ブランチ13a,13bをマージした後に、新たなバージョンに対応するノードがバージョン管理グラフ13に追加され得る。一例として、ブランチ13bにノードDが追加される。ノードDは、第3のバージョンに基づいて作成された第4のバージョンに対応し、データcを修正することで得られたデータdを参照する。上記のノードCの情報が編集された後では、ノードDはノードC+と関連付けられることになる。例えば、ノードDはノードC+への参照を含む。ブランチ13bにノードDが追加されてからノードCの情報が編集された場合には、ノードDが有する情報も併せて編集され得る。
そして、プロセッサ11は、バージョン管理グラフ13に含まれるブランチ13a,13bを再びマージする。このとき、プロセッサ11は、履歴情報14から、ブランチ13aに属するノードが参照するデータとブランチ13bに属するノードが参照するデータとから生成された過去のマージ結果のデータを検索する。該当する過去のマージ結果のデータが存在する場合、プロセッサ11は、その過去のマージ結果のデータを用いて、ブランチ13a,13bについての新たなマージ結果のデータyを生成する。
例えば、プロセッサ11は、履歴情報14から、ブランチ13aに属するノードBが参照するデータbとブランチ13bに属するノードC+が参照するデータcとから生成されたデータxを検索する。そして、プロセッサ11は、過去のマージ結果のデータxと前回のマージ後に追加されたノードDが参照するデータdとから、新たなマージ結果のデータyを生成する。なお、履歴情報14にデータxが登録されていない場合、プロセッサ11は、データbとデータdからデータyを生成することになる。過去のマージ結果を利用せずデータb,dからデータyを生成する場合と比べて、データx,dからデータyを生成する方が、抽出される修正量が少なくなりマージの負荷が軽減される。
第1の実施の形態の情報処理装置10によれば、バージョン管理グラフ13に含まれる既存のノードが編集されて当該ノードの識別子が変化しても、履歴情報14を参照して、過去に何れのデータから何れのマージ結果が生成されたかを特定することができる。よって、複数のブランチをマージするときに、バージョン管理グラフ13のみから利用可能な過去のマージ結果を探索する場合と比べて、利用可能な過去のマージ結果を発見できる確率が高くなる。このため、修正内容を抽出するための計算量やリポジトリへのアクセス回数を減らすことができ、複数のブランチをマージする負荷が軽減される。
[第2の実施の形態]
第2の実施の形態を説明する。第2の実施の形態の情報処理装置は、ソフトウェア開発プロジェクトで作成されるソースコードのバージョンを管理する。第2の実施の形態のバージョン管理システムとしては、例えば、Gitを使用することができる。
図2は、情報処理装置のハードウェア例を示すブロック図である。
情報処理装置100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。CPU101は、第1の実施の形態のプロセッサ11の一例であり、RAM102(または、HDD103)は、第1の実施の形態のメモリ12の一例である。
CPU101は、プログラムの命令を実行する演算回路を含むプロセッサである。CPU101は、HDD103に記憶されているプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを備えてもよく、情報処理装置100は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列実行してもよい。また、複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性メモリである。なお、情報処理装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OS(Operating System)やアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、情報処理装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、情報処理装置100に接続されたディスプレイ21に画像を出力する。ディスプレイ21としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ(PDP:Plasma Display Panel)、有機EL(OELD:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
入力信号処理部105は、情報処理装置100に接続された入力デバイス22から入力信号を取得し、CPU101に出力する。入力デバイス22としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、情報処理装置100に、複数の種類の入力デバイスが接続されてもよい。
媒体リーダ106は、記録媒体23に記録されたプログラムやデータを読み取る駆動装置である。記録媒体23として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ106は、例えば、記録媒体23から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信インタフェース107は、ネットワーク24を介して他の情報処理装置と通信するインタフェースである。通信インタフェース107は、ケーブルで通信装置に接続する有線インタフェースでもよいし、無線で基地局に接続する無線インタフェースでもよい。
ただし、情報処理装置100は、媒体リーダ106を備えていなくてもよい。また、端末装置からネットワーク経由で情報処理装置100を制御できる場合には、情報処理装置100は、画像信号処理部104や入力信号処理部105を備えなくてもよい。
図3は、リポジトリに格納されるオブジェクトの構造例を示す図である。
第2の実施の形態のバージョン管理システムは、1つのプロジェクトに関するファイル群が、1つのディレクトリ(ルートディレクトリ)を頂点とする木構造としてファイルシステム上に格納されていることを前提とする。あるディレクトリの配下には、他のディレクトリ(サブディレクトリ)や、ソースコードを記載したファイルが配置され得る。
バージョン管理システムのリポジトリには、「コミット」と「ツリー」と「ブロブ」の3種類のオブジェクトが格納される。コミットは1つのバージョンに対応し、ツリーはある状態の1つのディレクトリに対応し、ブロブはある状態の1つのファイルに対応する。コミットはバージョンに関する書誌情報を表しており、ツリーおよびブロブの集合はファイルシステム上の実体データを表していると言うことができる。
コミットのヘッダには、文字列“commit”と本文のデータ長が記載される。コミットの本文には、何れか1つのツリーのツリーIDが、タグ“tree”と共に記載される。コミットが参照するツリーは、そのコミットが示すバージョンのルートディレクトリに対応するルートツリーである。また、コミットの本文には、1または複数の他のコミット(親コミット)のコミットIDが、タグ“parent”と共に記載されることがある。コミットが参照する親コミットは、そのコミットが示すバージョンの元になった1つ前のバージョンを示す。ただし、コミットの中には、最初のバージョンに対応するコミットなど、“parent”の欄を含まないもの(参照する親コミットがないもの)もある。コミットの本文には、作成者名や更新日時などの他の情報も含まれ得る。
ツリーのヘッダには、文字列“tree”と本文のデータ長が記載される。ツリーの本文には、1または複数の他のツリー(サブツリー)のツリーIDが、データ種別がツリーであることを示すタグ“040000”と共に記載されることがある。ツリーが参照するサブツリーは、そのツリーが示すディレクトリの直下に配置されたサブディレクトリを示す。また、ツリーの本文には、1または複数のブロブのブロブIDが、データ種別がブロブであることを示すタグ“100644”と共に記載されることがある。ツリーが参照するブロブは、そのツリーが示すディレクトリの直下に配置されたファイルを示す。ただし、ツリーの中には、“040000”の欄を含まないもの(参照するサブツリーがないもの)や、“100644”の欄を含まないもの(参照するブロブがないもの)もある。
ブロブのヘッダには、文字列“blob”と本文のデータ長が記載される。ブロブの本文には、ソースコードなどのファイルの内容が記載される。
各オブジェクトは、ヘッダと本文が圧縮されて1つの圧縮ファイルとしてリポジトリに格納される。このとき、各オブジェクトには160ビット(16進数表記で40文字)の数値がオブジェクトIDとして付与される。リポジトリは、オブジェクトIDと圧縮ファイルとを対応付けて保持し、オブジェクトIDから所望の圧縮ファイルを抽出できるようにする。リポジトリとして、例えば、キーバリュー形式のデータベースを使用できる。
オブジェクトIDとしては、160ビットの数値を出力するハッシュ関数を用いて算出した、オブジェクトのヘッダおよび本文のハッシュ値を用いる。すなわち、コミットのオブジェクトID(コミットID)には、コミットのヘッダおよび本文のハッシュ値を用いる。ツリーのオブジェクトID(ツリーID)には、ツリーのヘッダおよび本文のハッシュ値を用いる。ブロブのオブジェクトID(ブロブID)には、ブロブのヘッダおよび本文のハッシュ値を用いる。なお、異なる内容のオブジェクトから同じハッシュ値が生成される確率(ハッシュ値が衝突する確率)は、十分に小さいものとする。
図4は、コミットとツリーとブロブの間の参照関係の例を示す図である。
コミットAは、ツリーaを参照する。ツリーaはルートツリーであり、コミットAが示すバージョンにおけるルートディレクトリに相当する。ツリーaは、サブツリーであるツリーa1とブロブ1を参照する。ツリーa1は、ブロブ2を参照する。コミットAから辿ることができるツリーa,a1およびブロブ1,2の集合は、コミットAが示すバージョンにおけるファイルシステム上の実体データに相当すると言うことができる。
コミットBは、コミットAが示すバージョンのデータを修正することで作成された次のバージョンを示し、親コミットであるコミットAを参照する。また、コミットBは、ツリーbを参照する。ツリーbはルートツリーであり、コミットBが示すバージョンにおけるルートディレクトリに相当する。ツリーbは、サブツリーであるツリーb1とブロブ1+を参照する。ツリーb1は、ブロブ2およびブロブ3を参照する。コミットBから辿ることができるツリーb,b1およびブロブ1+,2,3の集合は、コミットBが示すバージョンにおけるファイルシステム上の実体データに相当すると言うことができる。
コミットAのバージョンからコミットBのバージョンへの実質的な変更点は、ブロブ1の内容が書き換えられてブロブ1+に更新された点と、ツリーa1の配下にブロブ3が追加された点である。ブロブ1+の内容はブロブ1と異なることから、ブロブ1+にはブロブ1と異なるブロブIDが付与され、ブロブ1とは別にブロブ1+がリポジトリに格納される。一方、ブロブ2は内容が変化しないことからブロブIDも変化せず、ブロブ2はリポジトリに重複して格納されずにツリーa1とツリーb1から共通に参照される。
また、ツリーb1の内容は、ブロブ3への参照が追加されることでツリーa1から変化している。よって、ツリーb1にはツリーa1と異なるツリーIDが付与され、ツリーa1とは別にツリーb1がリポジトリに格納される。ツリーbの内容は、参照するツリーb1のツリーIDがツリーa1と異なり、参照するブロブ1+のブロブIDがブロブ1と異なるため、ツリーaから変化している。よって、ツリーbにはツリーaと異なるツリーIDが付与され、ツリーaとは別にツリーbがリポジトリに格納される。
このように、ブロブの追加・更新・削除は、ルートツリーからそのブロブへ至る経路上にある全てのツリーに影響を及ぼす。更新されたブロブおよび影響を受けるツリーは、前のバージョンのブロブおよびツリーとは異なるオブジェクトとしてリポジトリに追加される。一方、更新されなかったブロブおよび影響を受けないツリーについては、重複してリポジトリに追加されることなく、前にリポジトリに格納されたものが参照される。
次に、ブランチおよび複数のブランチのマージについて説明する。
図5は、ブランチのマージ例を示す図である。
ソフトウェア開発プロジェクトでは、複数のバージョン系列についての開発が並行して進められることがある。例えば、セキュリティ対策や実行速度向上などを目的として既存のソースコードをメンテナンスする作業と、新たな機能をソフトウェアに追加するために新たなソースコードを書く作業とを、並行して行うことがある。直列の1つのバージョン系列はブランチと呼ばれることがある。複数のブランチのうち、ソフトウェア開発の中心となるブランチは、マスタブランチ(または、メインラインやトランク)と呼ばれ得る。一方、マスタブランチから分岐して作成されたブランチは、フィーチャブランチと呼ばれ得る。フィーチャブランチは、後でマスタブランチにマージされることが予定される。
前述のコミットの集合からは、コミットをノードとしコミット間の参照関係をエッジとして表したコミットグラフを形成することができる。コミットグラフ上では、直列に繋がったコミット系列が1つのブランチに相当する。コミットグラフ上のフィーチャブランチは、マスタブランチに属する何れかのコミットから分岐する。一例として、コミット列A,B,C,Dというマスタブランチmbと、コミットAから分岐したコミット列E,Fというフィーチャブランチfb1とが、コミットグラフ上に表される。
ユーザは、ブランチ毎に何れか1つのコミットを作業対象のコミットとして参照する。多くの場合、ユーザはコミット列の末尾のコミット(最後に追加されたコミット)を作業対象とする。例えば、マスタブランチmbではコミットDが現在参照され、フィーチャブランチfb1ではコミットFが現在参照されている。ブランチに新たなコミットを追加するときは、作業対象のコミットの直後に当該新たなコミットが追加される。
マスタブランチmbとフィーチャブランチfb1とは、ユーザから入力されるマージ命令に応じてマージされる。例えば、コミットAはツリーaを参照し、コミットDはツリーdを参照し、コミットFはツリーfを参照しているとする。ツリーaからはブロブ1,2を辿ることができ、ツリーdからはブロブ1+,2,3を辿ることがで、ツリーfからはブロブ1−,2+を辿ることができる。すなわち、フィーチャブランチfb1がマスタブランチmbから分岐した時点以降、マスタブランチmbではブロブ1がブロブ1+に更新され、ブロブ3が追加されている。また、フィーチャブランチfb1ではブロブ1がブロブ1−に更新され、ブロブ2がブロブ2+に更新されている。
マージ結果としてのツリーおよびブロブの集合は、マスタブランチmbの修正内容とフィーチャブランチfb1の修正内容とを、衝突が発生しないように結合したものとなる。情報処理装置100は、まず、マスタブランチmbの末尾(または、現在の作業対象)であるコミットDとフィーチャブランチfb1の末尾(または、現在の作業対象)であるコミットFとから共通に辿ることができるコミットを、コミットグラフから検索する。このとき、コミットD,Fからの距離ができる限り小さい共通のコミットを探す。ここでは、2つのブランチの分岐点であるコミットAが共通のコミットとして検索される。
次に、情報処理装置100は、コミットDが参照するツリーdとコミットAが参照するツリーaとの間で差分をとることで、マスタブランチmbの修正内容を抽出する。ここでは、ブロブ1からブロブ1+への更新とブロブ3の追加とが抽出される。また、情報処理装置100は、コミットFが参照するツリーfとコミットAが参照するツリーaとの間で差分をとることで、フィーチャブランチfb1の修正内容を抽出する。ここでは、ブロブ1からブロブ1+への更新とブロブ2からブロブ2+への更新とが抽出される。
そして、情報処理装置100は、マージするブランチ間で衝突が発生していない修正内容をマージ結果に採用する。ここでは、情報処理装置100は、ブロブ3の追加とブロブ2からブロブ2+への更新とを自動的に採用する。一方、情報処理装置100は、2以上のブランチで異なる修正が行われたブロブについては、何れの修正を採用するかユーザに確認する。ここでは、情報処理装置100は、ブロブ1からブロブ1+への更新とブロブ1−への更新のうち、ユーザからの指示に応じてブロブ1+への更新を採用する。情報処理装置100は、採用した修正内容をツリーaに適用し、マージ結果としてツリーyを生成する。ただし、ブロブ1+への更新とブロブ1−への更新とが、ファイル内の異なる箇所を更新するものである場合、両者の修正内容をマージするようにしてもよい。
コミットグラフには、生成されたツリーyをルートツリーとして参照し、コミットD,Fを親コミットとして参照するコミットYを、ユーザから見えるように追加することもできる。ただし、第2の実施の形態では、ソースコードのマージとテストとを繰り返す作業形態を想定し、マージを行う毎にユーザから見えるコミットを追加することは行わない。その代わり、情報処理装置100は、マージ結果に対応するコミットYおよびツリーyを、ユーザから見えないコミットおよびツリーとしてリポジトリに保存しておく。ユーザから見えないコミットおよびツリーは、次にマージを行うときに内部的に利用される。
図6は、コミットに対するリベース処理の例を示す図である。
情報処理装置100は、コミットをリポジトリに追加した後に、ユーザから入力された命令に応じてそのコミットを編集することがある。コミットの編集の例として、同じブランチに属する2以上のコミットの入れ替えや統合などが挙げられる。コミットの入れ替えは、プロジェクト管理の都合上、あるバージョンの修正とその次のバージョンの修正とを、実際に行われた順序とは逆順で行われたものとして取り扱いたいときに行われ得る。コミットの統合は、プロジェクト管理の都合上、あるバージョンの小さな修正とその次のバージョンの小さな修正とを、同時に行われたものとして管理したいときに行われ得る。
ここでは、フィーチャブランチfb1に属するコミットE,Fを入れ替える例を説明する。コミットの入れ替えは「リベース」と呼ばれることがある。コミットEはツリーeを参照しているとする。ツリーeからはブロブ1−,2を辿ることができる。前述のように、コミットFはツリーfを参照している。すなわち、フィーチャブランチfbでは、まずブロブ1がブロブ1−に更新され、その後に更にブロブ2がブロブ2+に更新されている。コミットE,Fを入れ替えることは、まずブロブ2がブロブ2+に更新され、その後に更にブロブ1がブロブ1−に更新されたものと取り扱うことを意味する。
コミットE,Fを入れ替えるリベースが行われると、リポジトリには、コミットAを親コミットとして参照するコミットF+とコミットFを親コミットとして参照するコミットE+とが追加される。コミットF+はリベース前のコミットFに対応し、コミットE+はリベース前のコミットEに対応する。また、リポジトリには、ルートツリーとしてツリーf+が追加される。ツリーf+からはブロブ1,2+を辿ることができる。
コミットF+はツリーf+を参照する。これは、先にブロブ2からブロブ2+への更新が行われたことを意味する。コミットE+はツリーfを参照する。これは、ブロブ2からブロブ2+への更新に続いて、更にブロブ1からブロブ1−への更新が行われたことを意味する。このとき、コミットF+,E+のコミットIDは、コミット間の参照関係が変化したためコミットE,FのコミットIDと異なる。また、コミットF+が参照するツリーf+のツリーIDは、先に更新されたブロブが入れ替わったためツリーe,fと異なる。一方、リベース後の末尾のコミットE+が参照するツリーfは、リベース前の末尾のコミットFが参照していたものと同じである。コミットの順序を入れ替えるだけでは、累積された最終的な修正内容は入れ替え前と変わらないためである。
なお、リベース後のコミットF+,E+がリポジトリに追加されても、リベース前のコミットE,Fはすぐにはリポジトリから削除されない。不要になったコミットE,Fは、定期的なガーベッジコレクションによって後でリポジトリから削除される。ガーベッジコレクションでは、情報処理装置100は、オブジェクト間の参照関係に基づいて、他のオブジェクトから参照されていない孤立したオブジェクトを検索する。
例えば、リベース後のコミットE+は作業対象としてユーザから参照され、リベース前のコミットFはユーザから参照されなくなると考えられる。そのため、ガーベッジコレクションでは、コミットE+は削除されず、コミットF+はコミットE+から参照されているため削除されず、コミットAはコミットF+から参照されているため削除されない。一方、コミットFは孤立オブジェクトとして削除され、コミットFが削除されることで孤立オブジェクトになるコミットEは削除される。また、ツリーfはコミットE+から参照されているため削除されず、ツリーf+はコミットF+から参照されているため削除されない。一方、コミットEが削除されることでツリーeは削除される。
ガーベッジコレクションの周期は、ユーザが情報処理装置100に設定しておくことができる。周期は、リポジトリの空き容量と情報処理装置100の負荷とのバランスを考慮して決定することができる。例えば、ガーベッジコレクションの周期を2週間とする。
次に、過去のマージ結果を利用したブランチのマージについて説明する。
図7は、過去のマージ結果を利用した第1のマージ例を示す図である。
一例として、次のような場合を考える。マスタブランチmbの末尾がコミットDでありフィーチャブランチfb1の末尾がコミットFであるときに、マスタブランチmbとフィーチャブランチfb1とがマージされる。そして、マージ結果に対応するコミットYおよびツリーyが、ユーザから見えないようにリポジトリに格納される。その後、フィーチャブランチfb1の末尾に、ツリーgを参照するコミットG0が追加される。
マスタブランチmbとフィーチャブランチfb1とを再度マージする場合、情報処理装置100は、マスタブランチmbに属する何れかのコミットとフィーチャブランチfb1に属する何れかのコミットとの間で過去にマージが行われたか判定する。過去のマージの判定は、ユーザから見えないコミットも含むコミットグラフに基づいて行われる。ここでは、コミットDとコミットFからマージ結果としてコミットYが生成されていることが検出される。すると、情報処理装置100は、コミットDとコミットG0に基づくマージに代えて、過去のマージ結果としてのコミットYと過去のマージ以降にフィーチャブランチfb1に追加されたコミットG0とに基づいてマージを行うことを決定する。
コミットYとコミットG0に基づいてマージする場合、コミットYとコミットG0から辿ることができる最も近い共通のコミットは、コミットAではなくコミットFになる。そのため、情報処理装置100は、ツリーfからツリーyへの修正内容とツリーfからツリーgへの修正内容を抽出し、衝突が発生しないように修正内容をツリーfに適用すればよい。これにより、最も近い共通のコミットがコミットAである場合よりも、抽出される修正量が少なくなりマージを効率的に実行することができる。
その後、情報処理装置100は、新たなマージ結果としてのコミットZ0とツリーzを、ユーザから見えないようにリポジトリに追加する。コミットZ0は、ルートツリーとしてツリーzを参照し、親コミットとしてコミットY,G0を参照する。なお、生成されるツリーzは、過去のマージ結果を利用しない場合に生成されるものと同じである。
図8は、過去のマージ結果を利用した第2のマージ例を示す図である。
一例として、次のような場合を考える。マスタブランチmbの末尾がコミットDでありフィーチャブランチfb1の末尾がコミットFであるときに、マスタブランチmbとフィーチャブランチfb1とがマージされる。そして、コミットYおよびツリーyが、ユーザから見えないようにリポジトリに格納される。次に、リベースによってフィーチャブランチfb1のコミット列E,Fがコミット列F+,E+に編集される。その後、フィーチャブランチfb1の末尾に、ツリーgを参照するコミットGが追加される。
このとき、リベース後のコミットE+が参照するツリーfは、リベース前のコミットFが参照していたものと同じである。よって、マスタブランチmbとフィーチャブランチfb1とを再度マージする場合、情報処理装置100は、図7の場合と同様に過去のマージ結果であるツリーyを利用できることが好ましい。しかし、コミットグラフ上ではコミットFとコミットE+の間に同一性がない。単純にコミットグラフを探索するのみでは、マスタブランチmbに属する何れかのコミットとフィーチャブランチfb1に属する何れかのコミットとの間でリベース前に行われた過去のマージを検出できない。
そこで、情報処理装置100は、マージ結果のコミットとは別にツリーレベルのマージ履歴をリポジトリに格納しておく。ここでは、リベース前のマージの際に、コミットDが参照するツリーdとコミットFが参照するツリーfとからツリーyが生成されたことをマージ履歴に記録しておく。これにより、情報処理装置100は、リベース後のマージの際に、ツリーDが参照するツリーdとコミットE+が参照するツリーfとからツリーyが過去に生成されたことを、マージ履歴に基づいて検出することができる。
すると、情報処理装置100は、マージ方法をコミットグラフに基づいて判断できるように、ルートツリーとしてツリーyを参照し、親コミットとしてコミットD,E+を参照するコミットY+をリポジトリに追加する。コミットY+は擬似的なコミットであり、ユーザからは見えない。以降、情報処理装置100は、図7と同様の方法で、マスタブランチmbとリベース後のフィーチャブランチfb1とをマージする。
すなわち、ユーザから見えないコミットも含むコミットグラフに基づいて、コミットDとコミットE+からマージ結果としてコミットY+が生成されていることが検出される。すると、情報処理装置100は、コミットDとコミットGに基づくマージに代えて、コミットY+とコミットGとに基づいてマージを行うことを決定する。コミットY+とコミットGから辿ることができる最も近い共通のコミットは、コミットE+になる。そのため、情報処理装置100は、ツリーfからツリーyへの修正内容とツリーfからツリーgへの修正内容を抽出し、衝突が発生しないように修正内容をツリーfに適用する。
その後、情報処理装置100は、新たなマージ結果としてのコミットZとツリーzを、ユーザから見えないようにリポジトリに追加する。コミットZは、ルートツリーとしてツリーzを参照し、親コミットとしてコミットY+,Gを参照する。また、情報処理装置100は、ツリーd,gからツリーzが生成されたことをマージ履歴に記録する。
次に、情報処理装置100の機能およびマージ処理の手順について説明する。
図9は、第2の実施の形態の情報処理装置の機能例を示すブロック図である。
情報処理装置100は、リポジトリ110、コミット追加部121、コミット編集部122、マージ部123およびガーベッジコレクタ124を有する。コミット追加部121、コミット編集部122、マージ部123およびガーベッジコレクタ124は、例えば、CPU101に実行させるソフトウェアのモジュールとして実現される。
リポジトリ110は、バージョン管理に関するデータを記憶するデータベースである。リポジトリ110としては、例えば、データをキーとバリューの組として管理するキーバリュー形式のデータベース(キーバリューストア)を用いることができる。リポジトリ110は、公開オブジェクト記憶部111、内部オブジェクト記憶部112およびマージ履歴記憶部113を有する。これら3つの記憶部は、例えば、RAM102またはHDD103に確保した記憶領域として実現することができる。
公開オブジェクト記憶部111は、ユーザから見ることができるオブジェクトを、オブジェクトIDと対応付けて記憶する。内部オブジェクト記憶部112は、ユーザから見ることができない内部処理のためのオブジェクトを、オブジェクトIDと対応付けて記憶する。リポジトリ110としてキーバリューストアを用いた場合、オブジェクトIDがキーに相当し、オブジェクトがバリューに相当する。前述のように、記憶されるオブジェクトにはコミットとツリーとブロブが含まれる。各オブジェクトは、ヘッダと本文が圧縮されて1つのファイルとして記憶される。マージ履歴記憶部113は、マージ元のツリーとマージ結果のツリーとの対応関係を示すツリーレベルのマージ履歴を記憶する。
コミット追加部121は、ユーザからコミット命令を受け付ける。すると、コミット追加部121は、バージョン管理を行うファイルシステム上のファイル群から、ディレクトリ構造を維持するようにツリーおよびブロブの集合を生成する。そして、コミット追加部121は、生成した各ツリーおよび各ブロブのオブジェクトIDを算出し、オブジェクトIDと対応付けてツリーおよびブロブを公開オブジェクト記憶部111に格納する。ただし、既に存在するものと同じツリーおよびブロブは重複して格納されない。
また、コミット追加部121は、生成したツリー群のうちルートツリーを参照するコミットを生成し、生成したコミットのオブジェクトIDを算出し、オブジェクトIDと対応付けてコミットを公開オブジェクト記憶部111に格納する。ユーザが作業中のブランチに少なくとも1つのコミットが存在する場合、今回追加するコミットは、当該ブランチにおいて現在作業対象となっているコミットを親コミットとして参照する。
コミット編集部122は、ユーザからリベース命令など、既存のコミットを編集する命令を受け付ける。すると、コミット編集部122は、公開オブジェクト記憶部111に記憶されたコミットを編集し、編集したコミットのオブジェクトIDを算出する。そして、コミット編集部122は、編集前のコミットとは別に編集したコミットを、オブジェクトIDと対応付けて公開オブジェクト記憶部111に格納する。また、コミットの順序を入れ替える場合などコミットの編集がツリーに影響する場合、コミット編集部122は、影響内容を判定してツリーを生成し、公開オブジェクト記憶部111に格納する。
マージ部123は、ユーザからマージ命令を受け付ける。すると、マージ部123は、前述のような方法で複数のブランチをマージする。すなわち、マージ部123は、マージ履歴記憶部113に記憶されたマージ履歴を参照して、利用可能な過去のマージ結果を検索する。利用可能な過去のマージ結果がない場合、マージ部123は、公開オブジェクト記憶部111に記憶されたツリーやブロブに基づいてマージ結果を生成する。一方、利用可能な過去のマージ結果がある場合、マージ部123は、内部オブジェクト記憶部112に記憶されたツリーやブロブも利用してマージ結果を生成する。
そして、マージ部123は、マージ結果のコミットおよびツリーを内部オブジェクト記憶部112に格納する。また、マージ部123は、マージ履歴記憶部113に記憶されたマージ履歴に、マージ元ツリーとマージ結果のツリーとの対応関係を記録する。
ガーベッジコレクタ124は、ユーザによって設定された周期でガーベッジコレクションを行う。ガーベッジコレクタ124は、公開オブジェクト記憶部111および内部オブジェクト記憶部112に記憶されたオブジェクトの間の参照関係を辿り、これらオブジェクトのうち他のオブジェクトから参照されていない孤立したオブジェクト(不要なオブジェクト)を検出する。そして、ガーベッジコレクタ124は、公開オブジェクト記憶部111および内部オブジェクト記憶部112から、孤立したオブジェクトを削除する。
図10は、マージ履歴テーブルの例を示す図である。
マージ履歴テーブル114は、マージ履歴を登録するテーブルであり、リポジトリ110のマージ履歴記憶部113に記憶される。マージ履歴テーブル114は、親ツリーおよびマージ結果の項目を含む。親ツリーの項目には、マージされた2以上のルートツリーのツリーIDが列挙される。マージ結果の項目には、マージ結果として生成されたルートツリーのツリーIDが記載される。例えば、マージ履歴テーブル114には、親ツリーとしてのツリーd,fとマージ結果としてのツリーyとが対応付けられて登録される。
図11は、第2の実施の形態のマージ処理の手順例を示すフローチャートである。
(S10)マージ部123は、マージする複数のブランチそれぞれについて、末尾のコミット(または、作業対象のコミット)から共通のコミットに向かって、コミット列を辿る。そして、マージ部123は、ブランチ毎に、コミットが参照するルートツリーのツリーIDをコミットの順序に従って列挙したツリーIDの列を生成する。
例えば、図8の例の場合、マージ部123は、マスタブランチmbについて、コミット列D,C,B,Aに対応するツリー列d,c,b,aを示すツリーIDの列を生成する。また、マージ部123は、フィーチャブランチfb1について、コミット列G,E+,F+,Aに対応するツリー列g,f,f+,aを示すツリーIDの列を生成する。
(S11)マージ部123は、ステップS10で生成した複数のツリーIDの列それぞれから1つずつツリーIDを選択して得られるツリーIDの組の中から、マージ履歴テーブル114の親ツリーの項目に登録されているツリーIDの組を検索する。このとき、ツリーIDの列の前方から優先的に(すなわち、新しいバージョンのツリーのツリーIDから優先的に)マージ履歴テーブル114の親ツリーの項目と比較していく。
(S12)マージ部123は、マージ履歴テーブル114の親ツリーの項目に登録されているツリーIDの組が検出されたか判断する。例えば、図8の例の場合、ツリー列d,c,b,aとツリー列g,f,f+,aから、マージ履歴テーブル114の親ツリーの項目に登録されたツリー組<d,f>が検出される。検出された場合は処理をステップS13に進め、検出されなかった場合は処理をステップS16に進める。
(S13)マージ部123は、検出されたツリーIDの組に対応するマージ結果のツリーIDをマージ履歴テーブル114から取得する。そして、マージ部123は、取得したツリーIDをもつツリーが、内部オブジェクト記憶部112に存在するか判断する。当該ツリーが存在しない場合としては、ガーベッジコレクションによって当該ツリーが内部オブジェクト記憶部112から削除された場合が考えられる。存在する場合、処理をステップS14に進める。存在しない場合、処理をステップS11に進め、ツリーIDの列の後方に向かって条件を満たすツリーIDの組を検索していく。
(S14)マージ部123は、ステップS11で検出されたツリーIDの組に対応するコミットの組を、複数のブランチのコミット列の中から特定する。そして、マージ部123は、特定したコミットの組を親コミットとして参照し、ステップS13で確認したマージ結果のツリーをルートツリーとして参照する擬似的なコミットを生成する。マージ部123は、生成した擬似的なコミットを内部オブジェクト記憶部112に格納する。ただし、マージ結果のコミットが既に存在する場合は重複して格納しなくてよい。
(S15)マージ部123は、前述のような方法で、過去のマージ結果のコミットを考慮してマージ方法を決定する。このとき、マージ部123は、公開オブジェクト記憶部111に記憶されたユーザから見えるコミットと、内部オブジェクト記憶部112に記憶されたユーザから見えないコミットの両方を含むコミットグラフを使用する。図8の例の場合、マージ部123は、コミットDとコミットGの間のマージに代えて、コミットY+とコミットGの間でマージを行うと決定する。これにより、過去のマージ結果のツリーyを利用して、マスタブランチmbとリベース後のフィーチャブランチfb1とがマージされることになる。その後、処理をステップS17に進める。
(S16)マージ部123は、過去のマージ結果のコミットを考慮せずにマージ方法を決定する。このとき、マージ部123は、内部オブジェクト記憶部112に記憶されたユーザから見えないコミットを含まないコミットグラフを使用してもよい。
(S17)マージ部123は、ステップS15またはステップS16で決定したマージ方法に従ってマージ結果のツリーを生成し、生成したツリーを内部オブジェクト記憶部112に格納する。また、マージ部123は、マージ結果のツリーを参照するマージ結果のコミットを生成し、生成したコミットを内部オブジェクト記憶部112に格納する。このコミットは、マージ対象とした2以上のコミットを親コミットとして参照する。図8の例では、コミットD,Gの間のマージに代えてコミットY+,Gの間のマージが行われたため、マージ結果のコミットZはコミットY+,Gを参照している。
(S18)マージ部123は、マージする複数のブランチそれぞれについて、ユーザから見える末尾のコミット(または、作業対象のコミット)が参照するツリーを特定する。そして、マージ部123は、特定したツリーの組(親ツリー)のツリーIDとマージ結果のツリーのツリーIDとを対応付けて、マージ履歴テーブル114に登録する。図8の例の場合、ツリーd,gが親ツリーになりツリーzがマージ結果のツリーになる。
第2の実施の形態の情報処理装置100によれば、過去のマージ結果のツリーを利用して複数のブランチをマージすることができる。よって、ブランチが分岐した時点を基準にして修正内容を抽出する場合よりも、計算量やリポジトリへのアクセス回数を減らすことができ、複数のブランチをマージする負荷が軽減される。
また、コミットグラフに過去のマージ結果のコミットを追加することで、複数のブランチそれぞれの末尾のコミット(または、作業対象のコミット)から辿れる共通のコミットを容易に探索でき、過去のマージ結果を利用したマージ方法を効率的に判定することができる。更に、ツリーレベルのマージ履歴を参照することで、リベースなどコミットの編集が行われて編集の前後でコミットの同一性がなくなっても、実質的に利用することが可能な過去のマージ結果のツリーを検出してコミットグラフに反映させることができる。よって、過去のマージ結果を利用できる確率が向上し、マージ処理を効率化できる。
[第3の実施の形態]
第3の実施の形態を説明する。前述の第2の実施の形態との違いを中心に説明し、第2の実施の形態と同様の事項については説明を省略する。第3の実施の形態の情報処理装置は、ルートツリーレベルで過去のマージ結果を利用することができないときであっても、サブツリーレベルで過去のマージ結果を利用できるようにする。第3の実施の形態の情報処理装置は、図2,9と同様のブロック構成として実現することができる。以下では、図2,9で用いたものと同じ符号を用いて第3の実施の形態を説明する。
図12は、過去のマージ結果を利用した第3のマージ例を示す図である。
一例として、次のような場合を考える。コミットグラフ上には、マスタブランチmbおよびフィーチャブランチfb1,fb2が表されている。マスタブランチmbはコミット列A,B,C,Dを含む。フィーチャブランチfb1,fb2は、マスタブランチmbのコミットAからそれぞれ分岐したブランチである。フィーチャブランチfb1はコミット列E,Fを含み、フィーチャブランチfb2はコミット列H,Iを含む。
まず、マスタブランチmbとフィーチャブランチfb1とがマージされ、マージ結果のコミットYおよびツリーyがユーザから見えないようにリポジトリに格納される。このとき、マスタブランチmbのコミットDは、ルートツリーとして図5に示したツリーdを参照し、フィーチャブランチfb1のコミットFは、ルートツリーとして図5に示したツリーfを参照している。ツリーd,fをマージしてツリーyを生成するにあたり、情報処理装置100は、サブツリーであるツリーd1,f1をマージしてツリーy1を生成する。
その後、マスタブランチmbとフィーチャブランチfb2とがマージされ、マージ結果のコミットXおよびツリーxがユーザから見えないようにリポジトリに格納される。このとき、フィーチャブランチfb2のコミットIは、ルートツリーとしてツリーiを参照している。ツリーiからは、ブロブ1,2+,4およびツリーf1を辿ることができる。ツリーxからは、ブロブ1+,2+,3,4およびツリーy1を辿ることができる。
ツリーd,iをマージしてツリーxを生成するにあたり、情報処理装置100は、ルートツリーレベルでは先のマージ結果を利用できない。しかし、サブツリーレベルでは、ツリーd1,f1をマージしてツリーy1を生成するため、先のマージ結果を一部利用できる。そこで、情報処理装置100は、サブツリーレベルのマージ履歴も保持する。
図13は、サブマージ履歴テーブルの例を示す図である。
サブマージ履歴テーブル115は、サブツリーレベルのマージ履歴を登録するテーブルであり、リポジトリ110のマージ履歴記憶部113に記憶される。サブマージ履歴テーブル115は、サブツリーおよびマージ結果の項目を含む。サブツリーの項目には、マージされた2以上のサブツリー(コミットが参照するルートツリー以外のツリー)のツリーIDが列挙される。マージ結果の項目には、マージ結果としてのサブツリーのツリーIDが記載される。例えば、サブマージ履歴テーブル115には、マージ元としてのツリーd1,f1とマージ結果としてのツリーy1とが対応付けられて登録される。
図14は、第3の実施の形態のマージ処理の手順例を示すフローチャートである。
ステップS10〜S18は、図11に示した第2の実施の形態のマージ処理と同じである。第3の実施の形態のマージ処理では、情報処理装置100は、ルートツリーレベルで利用できる過去のマージ結果が存在しないと判断したとき、ステップS12とステップS16の間において以下に説明するステップS20〜S23を実行する。
(S20)マージ部123は、マージする複数のブランチそれぞれについて、末尾のコミット(または、作業対象のコミット)が参照するルートツリーを特定する。そして、マージ部123は、複数のルートツリーそれぞれの配下からサブツリーを1つずつ選択して得られるサブツリーの組を示すツリーIDの組の中から、サブマージ履歴テーブル115のサブツリーの項目に登録されているツリーIDの組を検索する。このとき、木構造のルートに近い方から優先的に(すなわち、ルートからリーフに向かって)検索していく。
(S21)マージ部123は、サブマージ履歴テーブル115のサブツリーの項目に登録されているツリーIDの組が検出されたか判断する。例えば、図12の例の場合、ツリーdの配下のサブツリー群とツリーiの配下のサブツリー群から、サブマージ履歴テーブル115に登録されたツリー組<d1,f1>が検出される。検出された場合は処理をステップS22に進め、検出されなかった場合は処理をステップS16に進める。
(S22)マージ部123は、検出されたツリーIDの組に対応するマージ結果のツリーIDをサブマージ履歴テーブル115から取得する。そして、マージ部123は、取得したツリーIDをもつサブツリーが、内部オブジェクト記憶部112に存在するか判断する。当該サブツリーが存在しない場合としては、ガーベッジコレクションによって当該サブツリーが内部オブジェクト記憶部112から削除された場合が考えられる。存在する場合、処理をステップS23に進める。存在しない場合、処理をステップS20に進め、木構造のリーフに向かって条件を満たすサブツリーの組を検索していく。
(S23)マージ部123は、ステップS21で検出したツリーIDをもつサブツリーについてマージ処理を省略すると決定する。この場合、マージ結果の木構造における1つ上位のツリーが過去のマージ結果のサブツリーを参照するようにすればよい。
なお、第3の実施の形態では、マージ部123は、ステップS18においてマージ履歴テーブル114に加えてサブマージ履歴テーブル115も更新する。すなわち、マージ部123は、マージ元のルートツリーから辿れるサブツリーとマージ結果のルートツリーから辿れるサブツリーとの対応関係を特定し、サブマージ履歴テーブル115に登録する。
第3の実施の形態によれば、第2の実施の形態と同様の効果が得られる。更に、第3の実施の形態によれば、ルートツリーレベルで過去のマージ結果を利用することができないときであっても、サブツリーレベルで過去のマージ結果を利用することができる。よって、複数のブランチのマージを更に効率的に実行することができる。
なお、前述のように、第1の実施の形態の情報処理は、情報処理装置10にプログラムを実行させることで実現することができる。また、第2および第3の実施の形態の情報処理は、情報処理装置100にプログラムを実行させることで実現することができる。
プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体23)に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からHDDなどの他の記録媒体(例えば、HDD103)にプログラムを複製して(インストールして)実行してもよい。
10 情報処理装置
11 プロセッサ
12 メモリ
13 バージョン管理グラフ
13a,13b ブランチ
14 履歴情報

Claims (5)

  1. コンピュータに、
    それぞれが複数のバージョンのデータの何れかを参照しており自ノードが有する情報に応じた識別子が付与される複数のノードを含む、バージョン間の関係を示すバージョン管理グラフに対して、既存のノードが有する情報を編集することを許容し、
    前記バージョン管理グラフに含まれる第1のブランチと第2のブランチとをマージするとき、過去に行われたマージについて2以上のバージョンのデータとマージ結果のデータとの対応関係を示す履歴情報に基づいて、前記第1のブランチに含まれるノードが参照する第1のバージョンのデータと前記第2のブランチに含まれるノードが参照する第2のバージョンのデータとから生成された過去のマージ結果のデータを検索し、
    検索された前記過去のマージ結果のデータを用いて、前記第1のブランチと前記第2のブランチとをマージしたときの新たなマージ結果のデータを生成する、
    処理を実行させるプログラム。
  2. 検索された前記過去のマージ結果のデータを参照する他のノードを前記バージョン管理グラフに追加し、前記他のノードを含む前記バージョン管理グラフに基づいて、前記過去のマージ結果のデータを利用するマージ方法を決定する、
    請求項1記載のプログラム。
  3. 前記履歴情報は、前記2以上のバージョンのデータに含まれる2以上のサブデータと前記マージ結果のデータに含まれるマージ結果のサブデータとの対応関係を更に示し、
    前記過去のマージ結果のデータが存在しない場合、前記履歴情報に基づいて、前記第1のバージョンのデータに含まれる第1のサブデータと前記第2のバージョンのデータに含まれる第2のサブデータとから生成された過去のマージ結果のサブデータを検索し、
    検索された前記過去のマージ結果のサブデータを用いて、前記第1のブランチと前記第2のブランチとをマージしたときの前記新たなマージ結果のデータを生成する、
    請求項1または2記載のプログラム。
  4. 前記編集は、一のブランチの中でノードの順序を入れ替えることを含む、
    請求項1乃至3の何れか一項に記載のプログラム。
  5. コンピュータが実行するバージョン管理方法であって、
    それぞれが複数のバージョンのデータの何れかを参照しており自ノードが有する情報に応じた識別子が付与される複数のノードを含む、バージョン間の関係を示すバージョン管理グラフに対して、既存のノードが有する情報を編集することを許容し、
    前記バージョン管理グラフに含まれる第1のブランチと第2のブランチとをマージするとき、過去に行われたマージについて2以上のバージョンのデータとマージ結果のデータとの対応関係を示す履歴情報に基づいて、前記第1のブランチに含まれるノードが参照する第1のバージョンのデータと前記第2のブランチに含まれるノードが参照する第2のバージョンのデータとから生成された過去のマージ結果のデータを検索し、
    検索された前記過去のマージ結果のデータを用いて、前記第1のブランチと前記第2のブランチとをマージしたときの新たなマージ結果のデータを生成する、
    バージョン管理方法。
JP2013067790A 2013-03-28 2013-03-28 プログラムおよびバージョン管理方法 Expired - Fee Related JP6024559B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2013067790A JP6024559B2 (ja) 2013-03-28 2013-03-28 プログラムおよびバージョン管理方法
US14/177,999 US9646030B2 (en) 2013-03-28 2014-02-11 Computer-readable medium storing program and version control method
EP14155734.8A EP2784665B1 (en) 2013-03-28 2014-02-19 Program and version control method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013067790A JP6024559B2 (ja) 2013-03-28 2013-03-28 プログラムおよびバージョン管理方法

Publications (2)

Publication Number Publication Date
JP2014191672A JP2014191672A (ja) 2014-10-06
JP6024559B2 true JP6024559B2 (ja) 2016-11-16

Family

ID=50184735

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013067790A Expired - Fee Related JP6024559B2 (ja) 2013-03-28 2013-03-28 プログラムおよびバージョン管理方法

Country Status (3)

Country Link
US (1) US9646030B2 (ja)
EP (1) EP2784665B1 (ja)
JP (1) JP6024559B2 (ja)

Families Citing this family (31)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9330184B2 (en) 2013-12-02 2016-05-03 Cltirix Systems, Inc. Methods and systems for machine learning to discover application compatibility status
US9600396B2 (en) * 2014-03-11 2017-03-21 Citrix Systems, Inc. Computer-implemented methods and systems for determining application matching status
EP2937779B1 (en) * 2014-04-24 2017-01-25 Semmle Limited Source code violation matching and attribution
US9916227B2 (en) 2014-05-05 2018-03-13 Citrix Systems, Inc. Systems and methods for analyzing software compatibility
US9417985B2 (en) * 2014-11-14 2016-08-16 Semmle Limited Distributed analysis and attribution of source code
US9507590B2 (en) 2014-12-08 2016-11-29 Semmle Limited Transitive source code violation matching and attribution
US9557968B1 (en) * 2014-12-23 2017-01-31 Github, Inc. Comparison graph
US20170139679A1 (en) * 2015-11-18 2017-05-18 King.Com Limited Methods and apparatus using a node graph architecture
US10007674B2 (en) * 2016-06-13 2018-06-26 Palantir Technologies Inc. Data revision control in large-scale data analytic systems
US9887975B1 (en) 2016-08-03 2018-02-06 KryptCo, Inc. Systems and methods for delegated cryptography
US9639353B1 (en) 2016-09-19 2017-05-02 Semmle Limited Computing quality metrics of source code developers
US9690690B1 (en) 2016-09-30 2017-06-27 Semmle Limited Scalable transitive violation matching
US9639352B1 (en) 2016-10-12 2017-05-02 Semmle Limited Computing rework churn for contributions to a code base
US10810009B2 (en) 2017-07-14 2020-10-20 Microsoft Technology Licensing, Llc Visualizations of software project and contributor activity
US10503495B2 (en) * 2017-08-02 2019-12-10 Accenture Global Solutions Limited Component management platform
CN107908421B (zh) * 2017-09-29 2022-06-24 北京创鑫旅程网络技术有限公司 软件代码版本管理与发布的方法及装置
US10430184B2 (en) * 2017-10-24 2019-10-01 Semmle Limited Violation match sets
US10303469B1 (en) * 2017-12-28 2019-05-28 Semmle Limited Commit graph generation
US10467004B2 (en) * 2017-12-28 2019-11-05 Semmle Limited Commit history linearization
EP3627343A1 (en) * 2018-09-19 2020-03-25 censhare AG Efficient in-memory multi-version concurrency control for a trie data structure based database
US10705832B2 (en) * 2018-09-28 2020-07-07 Atlassian Pty Ltd Efficient storage and analysis of source code modification history data
CN109358898B (zh) * 2018-10-24 2022-09-13 网易(杭州)网络有限公司 一种信息处理方法、装置、电子设备和存储介质
US10922291B2 (en) 2018-12-21 2021-02-16 Palantir Technologies Inc. Data pipeline branching
US10671373B1 (en) * 2018-12-30 2020-06-02 Microsoft Technology Licensing, Llc Mechanism for automatically incorporating software code changes into proper channels
JP7183092B2 (ja) * 2019-03-25 2022-12-05 アズビル株式会社 ソース情報管理装置およびソース情報管理方法
CN112445514B (zh) * 2019-09-05 2024-06-07 腾讯科技(深圳)有限公司 一种代码评审方法及相关产品
US11741084B2 (en) * 2019-09-27 2023-08-29 Autodesk, Inc. High frequency data management (HFDM)
US11604928B2 (en) 2020-04-30 2023-03-14 International Business Machines Corporation Efficiently managing predictive changes for a conversational agent
US11500623B2 (en) * 2021-01-22 2022-11-15 Microsoft Technology Licensing, Llc Reverting merges across branches
CN114296784A (zh) * 2021-12-29 2022-04-08 上海赛美特软件科技有限公司 一种数据筛选方法、装置、设备及存储介质
CN117055947A (zh) * 2023-08-17 2023-11-14 广东科伺智能科技有限公司 二进制项目文件的版本控制方法、装置、存储介质及设备

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0756721A (ja) 1993-08-11 1995-03-03 Nippon Telegr & Teleph Corp <Ntt> リビジョン管理方法
JPH0997171A (ja) 1995-09-29 1997-04-08 Hitachi Software Eng Co Ltd ソースプログラムのバージョン管理方法
JP2002099419A (ja) 2000-09-25 2002-04-05 Sony Corp ソフトウエアのバージョン管理方法及びバージョン管理システム
US20040230903A1 (en) * 2003-05-16 2004-11-18 Dethe Elza Method and system for enabling collaborative authoring of hierarchical documents with associated business logic
US7899883B2 (en) * 2008-06-13 2011-03-01 Microsoft Corporation Merging versions of documents using multiple masters
US8307010B2 (en) * 2008-09-26 2012-11-06 Microsoft Corporation Data feature tracking through hierarchical node sets
JP2010176594A (ja) * 2009-01-30 2010-08-12 Kyocera Mita Corp ソースコードバージョン管理プログラム及びソースコードバージョン管理方法
US9390124B2 (en) * 2013-03-15 2016-07-12 Microsoft Technology Licensing, Llc. Version control system using commit manifest database tables

Also Published As

Publication number Publication date
EP2784665B1 (en) 2015-09-16
EP2784665A1 (en) 2014-10-01
JP2014191672A (ja) 2014-10-06
US9646030B2 (en) 2017-05-09
US20140297592A1 (en) 2014-10-02

Similar Documents

Publication Publication Date Title
JP6024559B2 (ja) プログラムおよびバージョン管理方法
US20240265061A1 (en) System for synchronization of changes in edited websites and interactive applications
EP3103025B1 (en) Content based organization of file systems
US8433673B2 (en) System and method for supporting data warehouse metadata extension using an extender
US10423499B2 (en) Cataloging metadata for replication management and recovery
EP3362916B1 (en) Signature-based cache optimization for data preparation
CN107003935A (zh) 优化数据库去重
US8805777B2 (en) Data record collapse and split functionality
CN102902529A (zh) 变换的上下文知晓数据源管理
CN105320680A (zh) 一种数据同步方法及装置
CN112988217B (zh) 用于快速全网代码溯源检测的代码库设计方法及检测方法
JP2006172446A (ja) 複合データアクセス
JP2012234509A (ja) トランザクション処理装置、トランザクション処理方法およびトランザクション処理プログラム
JP6598997B2 (ja) データ準備のためのキャッシュ最適化
CN102426680B (zh) 使用求散列的逻辑帐户表
JP7279524B2 (ja) データ管理プログラム、データ管理方法およびデータ管理システム
JP6588988B2 (ja) 業務プログラム生成支援システムおよび業務プログラム生成支援方法
JP2018109898A (ja) データマイグレーションシステム
JP2018085042A (ja) データベース管理装置、情報処理システム、データベース管理方法及びデータベース管理プログラム
CN113886505A (zh) 一种基于搜索引擎和关系型数据库实现动态建模的管理系统
JP2010176594A (ja) ソースコードバージョン管理プログラム及びソースコードバージョン管理方法
JP2015153323A (ja) シンボリック実行プログラム、シンボリック実行方法及びシンボリック実行装置
US10229128B2 (en) Method and apparatus for the generation, organization, storage and retrieval of time stamped blocks of data
WO2023276212A1 (ja) ソフトウェア部品更新システム及びソフトウェア部品更新方法
JP2018005822A (ja) 仮想データベースシステム管理装置、管理方法及び管理プログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20151204

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20160905

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20160913

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160926

R150 Certificate of patent or registration of utility model

Ref document number: 6024559

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees