Reposoup: サブツリーの管理手法を考える会
いろいろとのっぴきならない事情で外部モジュールをsubtreeとして取り込むことがある。例えば、Gaucheは gc
ディレクトリにBoehm GCを取り込んでいる。
WasmLinuxではBoehm GCに専用のパッチを当てる必要があるが、Gaucheにそのパッチを当てつつビルドする ...というのをCIで廻す方法を考えたい。
git-subtree
Gaucheはgit-subtreeを使ったり、使わなかったりしている。
-
https://github.com/shirok/Gauche/commit/3c499dec8257e1c7271d4b25612e3b498172321d
- git-subtreeを使ったコミットの例(メタデータがある)
この手の管理は割とgit-subtreeが勧められている印象があるが、git-subtreeはコミットにしかメタデータを残さないため、逆方向のディスカバリがちょっと難しい。つまり、 "Gauche のソースに取り込まれているgcのリビジョンはいくつか?" を効率よく見つける方法はない。
手動でアノテートできるか問題
まぁ全歴史で148件くらいだったら、外部からの取り込みを手動でアノテートすることも可能か。。?
$ git log --first-parent --pretty=oneline . | wc -l
148
とりあえず適当に抽出する:
4f4544c919ae9384abb282e05baed8fe1518fef5 bdwgc 8.2.4
9601603db7aea7bb6e075b4f7f09210a919a35b5 Update to bdwgc 8.0.6
b3b859cc8da93cc9617711e9f2a5dd498cc9054c Merge pull request #457 from qykth-git/gc8.0.4-subtree
ef9664e618cd792c0d1626fc6ec168adaf61cc03 Merge pull request #414 from qykth-git/gc8.0.2-subtree
fe12b78d3aa0fd8e4319bffee44b6f4010dae120 Merge pull request #409 from qykth-git/gc7.6.10-subtree
6fc782a7d2cf3d7db2df751fa748fb8a6065ecd6 Merge pull request #373 from qykth-git/gc7.6.8-subtree
b4577453f0fca9fadbd9859223628fd7d7b01a30 Merge pull request #371 from qykth-git/libatomic_ops7.6.6-subtree
17aaba7be7191450a0a0bcb3e61a483051afa7bc Merge pull request #354 from qykth-git/libatomic_ops7.6.4-subtree
23cae27b48a834424cb3f49c5d04ee5d766b27f5 Merge pull request #349 from qykth-git/gc7.6.6-subtree
0776e4ded001aa7c569197ce47895645b73b8843 Merge pull request #342 from qykth-git/gc7.6.4-subtree
d0e4cdb0e9850659b412ab25c7c4fb3fee9de5ce Merge pull request #337 from qykth-git/gc7.6.2-subtree
2370d5331dcdd071db025e5035f9dc80ea894488 Merge pull request #286 from qykth-git/libatomic_ops7.6.0-subtree
f60a4303e74dcde2349e4f3babd5679eeea45c70 Merge pull request #226 from qykth-git/gc7.6.0-subtree
1ac52f409716479fef23c2875265b74723ac75de Merge pull request #224 from qykth-git/gc7.6.0-subtree
dad70c543e9a7e57bd6bd171afd3a0c1c003d26e Merge pull request #211 from qykth-git/gc7.4.4-subtree
6c9cfb17414446e6c54a75e4369ef2680a6b6545 Merge branch 'qykth-git-gc7.4.4-subtree'
c00727822f87cb50db06840c636586eee38071db Updated gc to 7.4.2
ee0b8499f9ada6cd06f953df9b53f705fd7f63f0 Updated bdwgc to 7.4
f814c1ce897ffdf548e2e84c6b7067e6c3e05695 Bumped gc to 7.2b
a8e3b706e7b62510d09880bbe4d45038564e785d Updated to gc to gc7.2-alpha6
a53908482628c23769d9cf640ae4798ff6fc86de boehm gc 7.1
c6a13720afbbc80a38d597d13381ddc7e6e47018 bumped to boehm gc 6.8
314762632dcc5d9bef3988149e8e8258f25f4166 Boehm GC 6.7. NetBSD thread.
f5651c6c87baefd6c9d5d2c014ce119d8b812be9 Boehm GC 6.5
e1457b1432afcfdfec6b7c5cadeee54ed3ba024b bumped to gc6.3
cbd7bd8a8c4bb3772b2eaa620ced8a4df268e299 upgraded to Boehm gc 6.2
93314ffb29a5c552a2996dc70098de8e3c71e841 updated to boehm gc 6.1
9b71ab9258145ec0c9357494a0606d108531d2f5 upgrade to Boehm GC 6.1alpha5
436b9c82217dfc62af68c10112d9c6a82b6d92fd upgraded to gc6.0
3c3f9607ebc4acd9e765778368a19911bcb0cfbd This commit was generated by cvs2svn to compensate for changes in r2, which included commits to RCS files with non-trunk default branches.
これらと本家Boehm GCリポジトリとの対応を付けていく必要がある。。まぁ30個くらいなら手動でなんとか。。
本家とのdiffを取る
ディレクトリを表わすtree objectは git ls-tree --object-only
にパスを与えれば取れる。(デフォルトではworking tree相対になるので、 --full-tree
も必要)
$ git ls-tree --full-tree --object-only HEAD -- gc
07a4c0dd81ac48e787c5667cc86346bd95843b7a
Treeish同士の比較は git diff-tree
でできる。 v8.2.4
はBoehmGC側のタグ。
$ git diff-tree --stat v8.2.4 07a4c0dd81ac48e787c5667cc86346bd95843b7a
.appveyor.yml | 106 -
.gitattributes | 16 -
.gitignore | 175 -
.travis.yml | 787 ----
compile | 348 ++
configure.ac | 66 +-
depcomp | 791 ++++
include/private/gc_priv.h | 8 +-
install-sh | 541 +++
ltmain.sh | 11147 ++++++++++++++++++++++++++++++++++++++++++++
m4/libtool.m4 | 8369 +++++++++++++++++++++++++++++++++
m4/ltoptions.m4 | 437 ++
m4/ltsugar.m4 | 124 +
m4/ltversion.m4 | 23 +
m4/lt~obsolete.m4 | 99 +
missing | 215 +
pthread_support.c | 3 +-
test-driver | 153 +
win32_threads.c | 2 +-
19 files changed, 22290 insertions(+), 1120 deletions(-)
cutout
インポート先のプロジェクトからサブプロジェクトを切り出すことを "カットアウト" と呼ぶことにする。Gaucheの gc
ディレクトリのカットアウトは、当該ディレクトリの --first-parent
履歴のtreeを連結した履歴となる ...文字にすると意味わかんねぇな。。
カットアウトは2つの履歴、つまり、Gaucheにおける gc
のカットアウトの場合:
- 元のBoehm GCの履歴
- Gaucheプロジェクト側での改変履歴
の和となる。
カットアウトは元の履歴の厳密なサブセットとなり、 元の履歴のどのリビジョンから作ったかの対応を保持しておく必要がある 。
カットアウトの意義
カットアウトは、マージ元プロジェクトの派生として処理できるため:
- origin-diff: 直接マージ元との差分を導出できる → マージ元に対してコントリビュートすべき差分の炙り出しができる
- skip-forward: 直接マージ元のHEADをマージできる → マージ元に対して容易に追従できる
特に、カットアウト上でマージ処理を行い、元プロジェクトのtreeを置き換えることでsubtree-mergeに相当する処理をチェックアウトなしで実施できる。
本家BDWGCのリポジトリに6.1alpha5が無い問題
無い。。しかし、Gaucheのログは6.1alpha5が存在したことを示唆している。