Заставить коммит иметь дополнительных родителей при коммите - PullRequest
0 голосов
/ 17 февраля 2019

Это связано с другим моим вопросом: Невозможно сделать замену ref "ermanent ".Чтобы было понятно, по какой-то причине git replace --graft в сочетании с git filter-branch не работает.

Мне нужно объединить три ветви, но объединение осьминога не удается (слишком разные файлы), поэтому я делаю все вручную(git show branch:file > file затем запустите meld).Однако история важна, поэтому мне нужно документально подтвердить, что branch является родителем.Поскольку я не могу сделать замену ссылочным ссылкам, несмотря на то, что делаю то, что мне говорят в файлах man и где-либо еще в Stackexchange (filter-branch), я ищу альтернативу.

Как видно из моего существующего вопроса,Моей первой мыслью было использовать замену, но она работает не так, как хотелось бы (они не «цементируются»).Точно так же git graft, кажется, не рекомендуется.Также, как уже упоминалось в связанном вопросе, слияние осьминога не удается.Просмотр git commit --help (справочная страница) ничего не дал.

Обратите внимание, что я не спрашиваю о добавлении дополнительных родителей в старый коммит.Я нахожусь на вершине ветви, которая еще не была сдвинута, и ни у одного коммита нет этого родительского.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019
git replace --graft @ branch_A branch_B branch_C
git filter-branch

Я делаю любую серьезную операцию в скретч-репо и отталкиваю результаты, которые хочу, поэтому, если что-то идет не так, выздоровление буквально так же просто, как уходить:

git clone -sb somebranch . `mktemp -d`; cd $_
major surgery here
git push origin whatever
cd -

, но для чего-тоэто тривиально, проще просто делать это локально и очищать резервные копии ссылок ветки фильтра всякий раз, когда

git filter-branch -f --setup exit

Возможно, стоит отметить, что все это сводится к выполнению ответа OP иполучение сообщения о коммите из извлеченного коммита.

0 голосов
/ 17 февраля 2019

Глядя на это на более низком уровне (как именно происходят коммиты), я наткнулся на прекрасную веб-страницу: https://jwiegley.github.io/git-from-the-bottom-up/1-Repository/4-how-trees-are-made.html.

Так что ответ - сделать это вручную.

git add file
git write-tree
echo "commit message" | git commit-tree -p branch_A -p branch_B -p branch_C $hash-from-previous-step
git update-ref refs/heads/branch_A $hash-from-previous-step #note I'm on branch_A

Вуаля!Затем я мог бы написать простую команду оболочки, которая принимает в качестве входных данных сообщение коммита и две другие ветви (используя HEAD в качестве первого родителя).

Черт возьми, я написал это как один вкладыш.

git add file && git update-ref refs/heads/branch_A $(echo "commit message" | git commit-tree -p branch_A -p branch_B -p branch_C $(git write-tree))
...