torutkのブログ

ソフトウェア・エンジニアのブログ

Gitリポジトリに空のブランチを作る

動機

Githubに、Redmineの用語集プラグインredmine_glossary)をフォークして修正を加えたものを置いています。
用語集プラグイン(glossary)をRedmine 3.0で動くようにしてみる - torutkの日記

Redmineの次回メジャーバージョンアップ版となる4.0.0では、ベースとなるRuby on Railsのバージョンが4.2から5.1に更新されます。これに伴い、プラグインに含まれるRails 4以前のDeprecatedとなり削除された機能を利用しているコードは修正を余儀なくされます。

そこで、redmine_glossaryのコードを再構築(リファクタリング程度の修正ではなく)しようと思います。再構築にあたっては、いったん既存コードは空にして、小さいコードから出発していきたいところです。ただし、Gitリポジトリは既存のものを使い続けたいとします*1

ふつうにgitのブランチを作ると、一番遡っても初期コミットの状態のブランチ(初期コミットで追加されたファイル群が存在する)となってしまいます。最初が空ならよかったのですが、フォークしてきたリポジトリは初期コミットがglossary_pluginのとあるバージョンのもの全体となっています。

そこで、空の新規ブランチを作れないか?というのが動機です。

捜索

検索ワード[git ブランチ 空]でぐぐってみたところ、意外とたくさん関連する情報が出てきました。

トップに出てきたブログはredmineプラグイン作者*2でもある@akiko-pusuさんのものでした!

orphanブランチを作ると、空のブランチとして利用できます。

orphanブランチ

redmine_glossaryプラグインのgitクローンを生成します。そして、--orphanオプションを指定してチェックアウトします。ここではブランチ名をreconstructとします。

work$ git clone https://github.com/torutk/redmine_glossary.git
work$ cd redmine_glossary
redmine_glossary$ git checkout --orphan reconstruct
redmine_glossary$ 

この時点で作業ツリーにはmasterのファイル群がそのまま存在します。作業ツリーの状態を確認します。

redmine_glossary$ git status
On branch reconstruct

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   README.ja.rdoc
        new file:   README.rdoc
        :

全てのファイルが新規扱いとなっており、コミットは1件もない状態ということが分かります。

空のブランチで開始したいので、master群のファイルがステージングされているのが邪魔です。また、作業ツリーに残っていても面倒です。

redmine_glossary$ git reset --hard
redmine_glossary$ ls -a
./  ../  .git/
redmine_glossary$

これで空のブランチができました。

ブランチが生成されていない?

redmine_glossary$ git branch -a
master
remotes/origin/HEAD -> origin/msater
remotes/origin/master

ブランチ一覧を見ると、ophanブランチが存在していません。なにか1つコミットしないとダメなようです。
README.rdocをコミットします。

  • README.rdoc
= redmine_glossary

This is a plugin for Redmine to create a glossary that is a list of terms in a project.

To adapt Redmine 4.0(Rails 5.1), reconstruct a glossary plugin from scratch.
redmine_glossary$ git add README.rdoc
redmine_glossary$ git commit -m "orphan branch for reconstructing from scratch"
  :
redmine_glossary$ git branch
  master
* reconstruct

ブランチに登場しました。これをリモートにプッシュします。

redmine_glossary$ git push -u origin reconstruct
  :

リモートのブランチをクローン

glossaryプラグインをゼロから開発します。Redmine 4.0開発版をチェックアウトし、pluginsディレクトリの下で先ほど作成したreconstructブランチをクローンします。

plugins$ git clone -b reconstruct https://github.com/torutk/redmine_glossary.git
  :

README.rdocファイルしかないので、プラグインの雛形を上書き生成します。

plugins$ bundle exec rails generate redmine_plugin redmine_glossary
      create  plugins/redmine_glossary/app
      create  plugins/redmine_glossary/app/controllers
      create  plugins/redmine_glossary/app/helpers
       : (中略)
    conflict  plugins/redmine_glossary/README.rdoc
Overwrite /mnt/d/toru/Documents/study/redminew/plugin_dev/trunk_glossary_dev/plugins/redmine_glossary/README.rdoc? (ent
r "h" for help) [Ynaqdh] n
        skip  plugins/redmine_glossary/README.rdoc
      create  plugins/redmine_glossary/init.rb
      :

README.rdocが存在するため、プラグインの雛形生成時に衝突が検出されます。nで雛形では上書きせずにスキップさせます。

*1:「新しいリポジトリを作ればいいのに」という意見があることは想像できます。ここではリポジトリを増やしたくない、既存リポジトリの再構築なので分けたくないというところです。

*2:定番プラグインであるissue_template、bannar