Open4

gitのbareリポジトリ上で直接merge処理ができるのか問題

okuokuokuoku

なんかできない理由は無い気がしてきた。

okuokuokuoku

GIT_INDEX_FILE だけだとダメ

$ GIT_INDEX_FILE=work git read-tree two

$ GIT_INDEX_FILE=work git merge three
fatal: this operation must be run in a work tree

work treeが無いとダメなら適当に指定すれば良いんだろうか。

okuokuokuoku

--work-tree で空ディレクトリを渡す → ダメ

$ mkdir empty

$ GIT_INDEX_FILE=work git --work-tree=./empty merge three
error: Your local changes to the following files would be overwritten by merge:
  A
Merge with strategy ort failed.

ファイルが無いと変更扱いになるからか。。

okuokuokuoku

git merge-tree

そもそも index を生成しなくても git merge-tree でマージ処理自体はできる。

$ git merge-tree two three
e7f926c94f31384807a0d31904c5e989faf83d61
100644 d474e1b4d626dbf09a9776c778e9f8691bc8b406 1       A
100644 9a7456b54df272ef6e98ab7ba0784c8970b04808 2       A
100644 8148ef7a0a32bea2296cd93f08c96f369a2aa3f3 3       A

Auto-merging A
CONFLICT (content): Merge conflict in A

当然ストラテジを渡せば無理矢理マージできる。

$ git merge-tree -X ours two three
aed29f65d92dd6a90c81adfe3091f20bda4f1f4c

$ git commit-tree -p two -m "Merged" aed29f65d92dd6a90c81adfe3091f20bda4f1f4c
7bb3b4325135fa902d64b69859d461642830ca12

$ git log 7bb3b4325135fa902d64b69859d461642830ca12
commit 7bb3b4325135fa902d64b69859d461642830ca12
Author: okuoku <mjt@cltn.org>
Date:   Thu Feb 1 20:37:39 2024 +0900

    Merged

commit ebddae13456486cf16020a1f27414daea791e87d (HEAD -> master, two)
Author: okuoku <mjt@cltn.org>
Date:   Thu Feb 1 20:20:44 2024 +0900

    2

commit e778a8bec4190632b9c0d20fc67b1a4d48b2395e
Author: okuoku <mjt@cltn.org>
Date:   Thu Feb 1 20:20:24 2024 +0900

    init

ただし出力はtreeなので commit-tree でコミットを作る必要がある。入力はブランチ。