🐕

GitHub の1つのリポジトリで管理している複数種類のコンテンツを分けてリリースする方法

2024/07/26に公開

結論からいうと

  • 同じリポジトリで複数の関係しないコンテンツを管理する場合にお互いに干渉なく tag & release を分けて作れる
  • それぞれの作業ブランチを作成して、作業ブランチに対して tag & release を作成する。そうすれば、main ブランチにマージする前に作った Asserts はお互いに干渉しない
  • main にマージしたあとに、マージコミットでなければ元のブランチに追従しているらしい?ので Asserts のコンテンツも混ざっていない(マージコミットの場合は混ざってしまう)

GitHub の tag & release の基本動作の確認

  • tag を作って GitHub に push すると、GitHub 上で tag に対して Asserts ファイルが作られる。
    • Asserts の中身は tag に対応するコミットまでのリポジトリのファイルを圧縮したものである(コミットハッシュも確認できる)
    • ポイント:tag を作った時に指定する commit が入っている branch をベースで Asserts ファイルを作り、該当 branch のファイル(指定 commit まで)が Asserts される。そのため、tag がブランチに依存しないのは嘘という結果になる?!
      • tag -> commit -> branch という依存関係
  • git log コマンドで tag と commit の対応関係を確認できる
    $ git log --oneline
    63a0953 (HEAD -> main, tag: v1.0.1, origin/main, origin/HEAD) add test_tag.txt
    8daa4f8 (tag: v1.0.0) fixup! add dog
    
  • GitHub Tags

main 以外のブランチで試した結果

  • main、test-tag、test-tag2 という3つのブランチを作成して、それぞれに対して tag を作成した

  • 結果:

    • tag v1.1.0 には、main ブランチ + '8fe7216' のコンテンツが入っている(new_file_created_in_test-tag_branch.txt が入っているが、new_file_created_in_test-tag2_branch.txt が入っていない)
      -- main branch --
      git switch test-tag
      touch new_file_created_in_test-tag_branch.txt
      git add .
      ...
      git tag v1.1.0
      git push origin v1.1.0
      
    • tag v1.2.0 には、main ブランチ + 'd883c4c' のコンテンツが入っている(new_file_created_in_test-tag2_branch.txt が入っているが、new_file_created_in_test-tag_branch.txt が入っていない)
      -- main branch --
      git switch test-tag2
      touch new_file_created_in_test-tag2_branch.txt
      git add .
      ...
      git tag v1.2.0
      git push origin v1.2.0
      
    • tag v1.1.1-test-tag2-commit には、main ブランチ + 'd883c4c' のコンテンツが入っている(上記 tag v1.2.0 と同じ)
      git switch test-tag
      git tag -a v1.1.1-test-tag2-commit -m 'add tag to commit of other branch' d883c4c
      git push origin v1.1.1-test-tag2-commit
      
      • test-tag ブランチに切り替えても、指定したコミット d883c4c が test-tag2 ブランチにあるため結局 test-tag ブランチと関係なし

更に main ブランチへマージ後に tag を試してみた

  • 先に test-tag を main にマージして、後は test-tag2 を main にマージした
  • あと main ブランチで test-tag2 の コミット d883c4c に対して tag を作成
$ git tag -a v1.0.3-test-tag2-commit -m 'add tag to commit of test-tag2 branch' d883c4c
$ git show v1.0.3-test-tag2-commit
tag v1.0.3-test-tag2-commit
Tagger: xxx
Date:   xxx

add tag to commit of test-tag2 branch

commit d883c4c8da261d078bcbac272f751d89a43f4580 (tag: v1.2.0, tag: v1.1.1-test-tag2-commit, tag: v1.0.3-test-tag2-commit, origin/test-tag2, test-tag2)
...
$ git push origin v1.0.3-test-tag2-commit
$ git show d883c4c
commit d883c4c8da261d078bcbac272f751d89a43f4580 (tag: v1.2.0, tag: v1.1.1-test-tag2-commit, tag: v1.0.3-test-tag2-commit, origin/test-tag2, test-tag2)
...
  • tag v1.0.3-test-tag2-commit には、main ブランチ + 'd883c4c' のコンテンツが入っている(上記 tag v1.2.0 と同じ)。結局、tag に指定したコミットのオリジナルのブランチ(test-tag2)に追従していることが分かった
  • 更に、test-tag2 ブランチをローカル&リモートから削除してもずっと test-tag2 の 'd883c4c' を追従して Github 上の Asserts を作成したことが分かった(少しマジックな感じ。test-tag2 ブランチを削除してもが裏で生き続けているっぽい)

参考資料

松の風

Discussion