Help us understand the problem. What is going on with this article?

開発者が少ないチームはリポジトリを少なくしよう。Git Subtreeで履歴を残したままリポジトリを統合する

まとめ

git subtreeの使い方だけ気になる人は、目次からどうぞ

  • 少人数の開発チームではリポジトリを少なく保とう
  • リポジトリを減らすために、git subtreeを使ってリポジトリを統合しよう

はじめに

開発者が5人以下のような、小さなチームではリポジトリが増えてくると管理が難しくなります。

どんなとき不都合が出るんでしょう?

複数のリポジトリをまたがった変更の差分を確認しづらい
:stuck_out_tongue:このPull Requestは、別のリポジトリのPull Requestのマージが必要なので、両方とも見ながらレビューして!

アプリケーションとリポジトリの対応を覚える必要がある
:worried:このシステムってどのリポジトリだっけ?

リポジトリ数が増えてくると、リポジトリ権限やリポジトリ設定をする労力が増える
:angry:このリポジトリ、Slack連携まだしてないじゃん!なんで……?

複数リポジトリにまたがった課題を管理しづらい
:anguished:このIssueは複数のリポジトリに、またがっているからリポジトリごとにIssueを作らないといけないね!

これらは、実際にあった例です。このチームは4人に対して、14個のリポジトリを抱えていました :weary: 1。リポジトリが増えてくると、 チームが管理しているリポジトリを一覧するためのドキュメント も用意されました。

そのチームは問題を解決するために、モノリポ2への移行を決意しました。

モノリポの利点

  • コードが再利用しやすい
  • 開発者同士のコラボレーションが簡単になる
  • コミットを通じて依存がシンプルになる
  • 根本的なリファクタリングや改修が行える
  • 多数のリポジトリを管理するコストから解放される

モノリポにすると、コードがどのリポジトリにあるか明確になります。リポジトリ一覧のドキュメントなんてもう要りません!
コードが一箇所に集約されることで、すでにある資産を使い回せますし、アプリケーションをまたいだリファクタリング(ワークアラウンドではない!)もできます。

「モノリポいいじゃん」って思いました?

注意が必要です。モノリポには、さまざまなプログラミング言語やビルドシステムを統合する必要があります。ビルドシステムを統合するソリューションとして、

が提供されています。興味がある人は調べてみてください。

モノリポへの第一歩

モノリポにすると決断したものの、リポジトリを1つにまとめるにはどうしたらいいでしょう? とっておきのコマンドがあります。

git-subtreeです。

外部のリポジトリを取り込むことができます。コミットへの参照だけを持つgit-submoduleと違い、完全な履歴として取り込むことができます。直接変更もできますね!

git-subtreeの使い方

マスターとサブのディレクトリを用意します。マスターは取り込む側、サブは取り込まれる側です。

subtree-masterに、subtree-subのリポジトリを取り込みます。

$ tree
.
├── subtree-master
│   └── README.md
└── subtree-sub
    └── README-sub.md

マスターのGit Log

$ git log --oneline
a3f47ce (HEAD -> master) init

サブのGit Log

$ git log --oneline
d9dbc28 (HEAD -> master) update
ab3553f init(sub)

実際に取り込む

$ cd subtree-master #マスターのディレクトリに移動
$ git remote add sub-repo ../subtree-sub #リモートリポジトリでもOK
$ git subtree add --prefix=sub sub-repo master #subというディレクトリが切られる
git fetch sub-repo master
warning: no common commits
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From ../subtree-sub
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> sub-repo/master
Added dir 'sub'

subというディレクトリ以下に、サブリポジトリの内容が取り込まれます。

$ tree
.
├── subtree-master
│   ├── README.md
│   └── sub
│       └── README-sub.md
└── subtree-sub
    └── README-sub.md

3 directories, 3 files

マスターのリポジトリでGit Logを確認します。サブリポジトリの中身のコミットが丸々取り込まれていることがわかります。これで履歴を消さずに統合できました。

$ git log --oneline
1d9c231 (HEAD -> master) Add 'sub/' from commit 'd9dbc28107de903e4c1f0c0680a6af9926d031da'
d9dbc28 (sub-repo/master) update
ab3553f init(sub)
a3f47ce init

subディレクトリが不要だと感じたら、git mvで中身を移動したり、ディレクトリを削除してコミットすれば自由にできます。

$ tree
.
├── subtree-master
│   ├── README-sub.md
│   └── README.md
└── subtree-sub
    └── README-sub.md

2 directories, 3 files
$ git log --oneline
a2eadbf (HEAD -> master) ディレクトリを無くしてREADMEをルートへ移動
1d9c231 Add 'sub/' from commit 'd9dbc28107de903e4c1f0c0680a6af9926d031da'
d9dbc28 (sub-repo/master) update
ab3553f init(sub)
a3f47ce init

まとめ

  • 少人数の開発チームではリポジトリを少なく保とう
  • リポジトリを減らすために、git subtreeを使ってリポジトリを統合しよう

  1. 5人のチームならリポジトリの数は、2-3リポジトリに抑えたほうがいいと思います。 

  2. ここでは「リポジトリの数を少なくして極力1つのリポジトリとしてまとめよう」という試み 

tamanobi
Vim/Python/C++/Common Lisp/PHP/JavaScript/データ分析/機械学習/画像解析/NEM
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした