$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

あるレポジトリを別のレポジトリのサブディレクトリへ履歴付きで移動する

あるレポジトリのサブディレクトリ配下を別のレポジトリへ履歴付きで移行する - $shibayu36->blog; の逆バージョン。

あるレポジトリでずっと開発していたが、やっぱりモノレポの中に入れたいとなって、履歴付きでモノレポの特定のサブディレクトリ配下に移動したい時があった。たとえば https://github.com/shibayu36/go_todo_app の履歴をすべて https://github.com/shibayu36/go-playground のgo_todo_appディレクトリに移したいみたいなケースだ。この時コミット履歴としてはgo-playgroundのgo_todo_app/配下で初めから開発していたかのように移したい。

この解決策として Gitのサブツリーのマージについて - GitHub Docs にあるように、サブツリーマージという方法も取れる。しかしこちらは履歴的にはレポジトリルートで開発した後にgit mvでサブディレクトリに移したような履歴になってしまう。これだとgit logなどで変更を追いかけづらい。

そこで今回もgit filter-repoを使って移動する。作戦としては

  • go_todo_appレポジトリ側で、go_todo_app/ディレクトリで開発しているような履歴に変更する
  • go-playgroundレポジトリのremoteとしてgo_todo_appレポジトリを追加し、mergeコミットを作ってサブディレクトリ配下で開発していたような履歴を作る

ではやってみよう。まずはgit-filter-repoを入れておく。

brew install git-filter-repo

続いて、go_todo_appレポジトリ側で、go_todo_app/ディレクトリで開発しているような履歴に変更する。git filter-repoの--to-subdirectory-filterを使うと簡単にできる。

git clone git@github.com:shibayu36/go_todo_app.git
cd go_todo_app
git filter-repo --to-subdirectory-filter go_todo_app
cd ..

さらにgo-playgroundへgo_todo_appレポジトリの履歴をマージする。

git clone git@github.com:shibayu36/go-playground.git
cd go-playground
git remote add go_todo_app ../go_todo_app # localのディレクトリをremoteとして追加
git fetch go_todo_app main
# --allow-unrelated-historiesを使うことで別の履歴をマージできる
# --no-ffを使ってマージコミットを確実に作る
git merge --allow-unrelated-histories --no-ff go_todo_app/main
git push origin main

これで完了。go-playgroundレポジトリの履歴は こちらのようになり、さらにhttps://github.com/shibayu36/go-playground/commits/main/go_todo_appを見るとgo_todo_app/サブディレクトリ配下で初めから開発していたような履歴になっている。

Googleスプレッドシートで複数シートの内容を1つのシートに統合する

たとえばユーザー向け開発とリファクタリングなどの内部改善を、スプレッドシートの別シートで管理していたとする。これらを別シートに分けている理由は管理したい情報がそれぞれで違うためだ。

一方、それら進行状態については全部一覧で見たいことがあった。そうすることで、全てのタスクを含めて状況を把握しやすいためだ。

これを対応するためにGoogleスプレッドシートでいろいろ試してみたのでメモ。

シートの例

https://docs.google.com/spreadsheets/d/1IJ4qORImjfzVDodH0Z4vINRmXcqYjg9095uRVlTfSRI/edit#gid=0 にサンプルを作ってみた。シート1には機能開発一覧としてID、ステータス、タイトルという列を使って管理している。シート2にはリファクタリング一覧としてID、ステータス、名前、担当者が入っている。

QUERYと配列結合を使って統合する

QUERY配列を使うことで、この二つのシートを結合した別シートを作れる。たとえばこの二つからIDとステータスとタスク名を取り出したいなら、見出しは手作業で書いた上で、その下に次のような式を書けば良い。

= {QUERY('シート1'!A:C, "SELECT A, C, B WHERE A != '' OFFSET 1", 0); QUERY('シート2'!A:E, "SELECT A, C, B WHERE A != '' OFFSET 1", 0) }

= { }の部分が配列の結合部分だ。;を使うことで同じ列数を持つデータを縦方向に結合ができる。

QUERY式を使うことで、別シートから柔軟に列を指定して取り出すことができる。見出し部分を除去するためにOFFSET 1と3引数目に0を指定するという工夫をしている。

あとは結合したシートでフィルタ表示を使えば、絞り込みやソートを簡単に行える。便利。

この辺りの知識があれば、さらに別のスプレッドシートからIMPORTRANGEでデータを取ってきた上でQUERYでフィルタかけて結合なども簡単に行えるようになる。

参考資料

多様性の力を知る - 多様性の科学を読んだ

タイトルを見てなんとなく興味が惹かれたので読んだ。想像以上に面白くてためになった。

多様性の科学

多様性の科学

Amazon

自分はこの本から多様性が実際に何に役立つかを学ぶことができた。世の中では多様性が大事と非常に多く言われている。しかし自分は多様性の高さによってどのような効果があるかについて理解ができていなかった。この本はいろんな観点から効能について教えてくれる。例えば興味深かったところは

  • 人の物事の捉え方には、ただものを見るという単純な行動にさえ、文化に基づく違いがある。ある問題において、見方が多様な集団を作ることにより、新たな捉え方や落とし穴への気づきが得られる
    • 逆に同質な集団の場合、考えていることが正しいと周りも同意するため、それが間違っていたとしても信じてしまう
    • 賢い個人がいるだけでなく、解決しようとする問題空間の中を網羅するような多様な構成にすべき
  • ある集団の平均値を用いて標準的な何かを作ると、逆に誰にも便利ではないものが出来上がってしまう
    • パイロットのいろんな部位の身体計測をして、それを元に標準的な戦闘機を作ったら、墜落率が高かったみたいな話題。サイズをカスタム可能な戦闘機にすると墜落率が下がった
  • 心理的安全性がない集団では、もともと多様性が高い集団だったとしても、支配的なリーダーの思想に寄っていってしまい、多様性が低い状況になってしまう

これ以外にも色々となるほどなーと思うことが多かったのでおすすめです。

読書ノート

- 人の物事の捉え方には、ただものを見るという単純な行動にさえ、文化に基づく違いがある 26
    - 違う見方をするもの同士が協力し合えば、ひとりの時より多くの発見が得られる 28
    - 同じような人々の集団は盲点も共通しがち。その傾向を互いに強化してしまうため、不適切な判断や完全に間違った判断にも自信を持つようになる 34
- チームで難問に挑む際にまずやるべきことは、問題そのものをさらに精査することではなく、一歩下がってこう考えること。カバーできていないのはどの分野か、無意識のうちに盲点を作ってしまっていないか、画一的な人間ばかりで問題空間の片隅に固まっていないか? 70
    - 問題空間と領域の例
    - 集合知を得るには、賢い個人と、同時に多様性も欠かせない。そうでなければ同じ盲点を共有することになる 76
    - 多様性を満たすためには、対処する問題と密接に関連し、かつ相乗効果を生み出す視点を持った人々を見つけることが鍵になる 83
- 多様性豊かなチームに支配的なリーダーがいた場合、多様性が下がる 115
    - 心理的安全性が高いことは、多様性を下げない利点になる 140
- 多様性を損なわない会議テクニック 143
    - 会議前にまとめたメモを黙読した時間を作り、他人の意見が入る前に個々が考えられる時間を作る
    - 会議が始まったあと、最も地位の高いものが最後に意見を述べる
    - 誰のアイデアかを明らかにしない
- 人は大きなコミュニティに属すると、より狭いネットワークを構築する傾向がある 207
    - 交流できる人の数が多いなら、自分と似ている人の数も多く、細かい選り好みができる
    - 小規模なコミュニティに属すると、逆に多様な人間とのコミュニケーションがなされる
- 平均値が適切に利用されれば複数の人々の視点や意見を活かせる。しかし不適切な場合には、複数の人々に平均的な答えを押し付けることにしかならない 251
    - 気づき: 標準化の罠とも近い
- 「標準的な」「誰にでも当てはまる」食事療法というのは基本的にない 256
- 日常に多様性を取り込むための3つのこと 292
    - 無意識のバイアスを取り除く
        - 採用で履歴書の目隠しをする、など
    - 陰の理事会
        - 重要な戦略や決断について、若い社員が上層部に意見を言える場
        - 上層部にとっては、多様な意見に触れて視野を広げる「テコ入れ」の機会になる
    - 与える姿勢
        - 多様な社会で、自分の考えや知恵を相手と共有する「giver」は、他の人から知恵を受け取る機会を得られ、成功を収めやすい