2016-11-17 6 views
0

Я работаю над восстановлением истории кодовой базы. Я восстановил commits lost at the root моего git repo и теперь обнаружил новое осложнение.Восстановить историю расходящегося, затем конвергентного репо

Большая часть кода была разделена на отдельную кодовую некоторое время ... а потом слился обратно.

Main repo: A -- B -- C -- D -- E 
        |  ^
Code moved:  |   | 
        V   | 
Other repo:  X -- Y -- Z 

Когда раскол (и слияние) произошло, файлы просто копируются в целевой репо, и история была потеряна.

Чтобы усложнить ситуацию, файлы были слегка изменены для каждой копии перед фиксацией, поэтому вполне вероятно, что мне понадобится дополнительная фиксация для этих изменений.

Это приводит меня к двум вопросам:

Будет ли возможность заменить совершить D (который копирует файлы обратно в) с нижней ветвью (X-Y-Z)? (Это мой приоритет.)

Если возможно, будет ли возможно восстановить историю файлов, созданных при фиксации X?

Существует около 300 коммитов на «другом» репо и около 5000 на «основном» репо от D и далее.

Возможно, я подозреваю, что git-rebase, но в идеале, я хотел бы использовать git-filter-branch, так что мне не нужно вручную разрешать конфликты исторического слияния.

ответ

1

Возможно, вы захотите установить git replace -ments, чтобы хирургически изменить/спланировать историю, не изменяя содержание любых существующих коммитов. Затем сделайте ветвь фильтра, как мы уже говорили в другом месте, чтобы заставить эти заменяющие трансплантаты стать постоянными.

Потому что git replace позволяет вам заменять один объект замены везде, где Git обычно «видит» оригинал, а потому, что у коммитов есть идентификаторы фиксации родителя, вы можете заменить единый фиксатор цепочкой из нескольких коммитов. Например, если совершить X «плохо» в некоторых хорошо определенным образом:

...--o--P--X--Q--o--... 

затем построим новую последовательность «хорошо» совершает G ... G п:

...--o--P--X--Q--o--... 
     \ 
      G1--G2--...--Gn 

(где G «родитель совершает идентификатор является P, что наш плохой X родитель совершает то, если X потребности, или заслуживает, несколько родителей, мы можем установить все те, в хорошем commi t G). Тогда мы поручаем Git, чтобы «заменить» X с G п, так что обход выглядит следующим образом:

...--o--P--X- [replaced] -Q--o--... 
     \    /
      G1--G2--...--Gn 

После фильтрации, X исчезает полностью, с коммитами Q, а затем копируется в свои новые копии в обычном фильтр-ветвь моды.

Для построения «хорошо» совершает, вы можете буквально git checkout -b tempbranch <P>, а затем начать делать коммиты, хотя, если вам нужно установить несколько родителей, это немного сложнее (вы можете использовать git commit-tree вместо простого git commit или обмануть, создавая .git/MERGE_HEAD с остальными дополнительными хэшами в нем). Вы можете захотеть задержать новые «хорошие» коммиты и/или установить произвольных авторов (git commit имеет ключи командной строки для них, git commit-tree заставляет использовать магические переменные env).

Смежные вопросы