Я думаю, что могу помочь вам в этом, так как раньше мне нужно было сделать нечто подобное.
Недостатком является то, что мое решение потребует некоторой переписывания истории.Если у вас много соавторов, это будет больно, так как история каждого изменится.На самом деле я не знаю, как это обойти, потому что даже такая простая вещь, как добавление родительского коммита перед вашим текущим корнем, изменит сообщение msg или наш старый корень, который изменит свой SHA, что повлияет на родительское поле его потомка,который меняет свой SHA и т. д. и т. п.
Если посмотреть на свой репозиторий на github, похоже, что у вас есть только пара участников, так что это не так уж и сложно.
Я также предполагаю, что хранилище пакетов в https://github.com/MinIenM/BAG-Extract не прогрессировало с тех пор, как вы его прочитали, что, считая дату ваших коммитов и коммитов BAG-Extract, как я полагаю, имеет место.
Так как кажется, что ваша цель - просто дать кредит, слияние поддеревьев, вероятно, для вас.
Мы в основном сделаем следующее:
- Считайте в BAG-Extract новую ветвь.У него не будет общей истории.
- Укажите, где в своей истории вы занесли в подкаталог bag.Мы назовем это «bagin»
- Добавьте новый коммит слияния, который будет иметь последний коммит BAG-Extract и коммит из (2) в качестве родителей.Это будет слияние поддерева, так что идея состоит в том, что два родителя отличаются только тем, что одному из них предшествует поддерево (например, bag /)
- Перебазировать всю историю вашего сообщения "bagin" на этот объект слияния.
Вот код для этого.Чтобы быть в безопасности, я бы клонировал вещи в свежий репозиторий, который вы можете выбросить, если все пойдет не так, как запланировано
git clone git@github.com:milovanderline/NLExtract
git log -- bag #Identify the first commit where "bag" enters. It starts with 78575
git checkout 78575 -b bagin
git remote add bag git@github.com:MinIenM/BAG-Extract
git fetch bag
git checkout bagin -b baginmerge
git merge bag/master -s subtree #Create the new merge object. baginmerge now points to the merge object. bagin, which hasn't moved, now has two children, one is the merge object, the other is your old history.
git rebase --onto baginmerge bagin master -p #Calculate the diffs from bagin to master, and replay them onto baginmerge. The -p flag tells rebase to preserve merges.
На самом деле, я уже разветвил ваш репозиторий и выполнил шаги, описанные выше,В моем репозитории на https://github.com/dankessler/NLExtract вы найдете новую ветку с именем rebased_master.Не стесняйтесь вносить это. К сожалению, глядя на ваш сетевой график, люди отказались от вашего репо, и это, скорее всего, испортит их, но они должны быть в состоянии перебазировать или выбирать из любых будущих обновлений, так как содержимоеиз ваших коммитов должны быть идентичны, только их SHA изменились.
Если вы проверяете http://help.github.com/subtree-merge/, стратегия слияния поддеревьев в основном аналогична, так как это должно позволить вамвы можете использовать в дальнейшем разработку BAG-Extract, если вы того пожелаете.
Я могу представить себе другую стратегию, которая бы выглядела так, как если бы разработка bag изначально осуществлялась как поддерево your хранилище (но с правильным идентификатором автора), но это, вероятно, не то, что вы ищете.Плюс в том, что такие утилиты, как git blame и прочее, могут работать лучше, но они значительно сложнее и требуют git filter-branch
, которого, как я обычно слышал, следует избегать, когда это возможно.Если вы хотите пойти по этому пути, дайте мне знать, и я объясню более подробно.
Удачи и ура!