Как объединить два репозитория git, сохранив историю обоих и хэши одного? - PullRequest
0 голосов
/ 24 февраля 2019

Что у меня есть

У меня прочитано много SO вопросов о объединение хранилищ .Я почти у цели, но мне чего-то не хватает.

У меня есть два репозитория current-repo, которые опубликованы и опубликованы, и old-repo, которых нет.У меня есть единственная копия.Их истории выглядят примерно так:

                         1--2--3--4--5  <= current-repo
                         =
                content is the same
                         =
old-repo =>  a--b--c--d--e

Что я хочу

В идеале, если объединить два репо, я получу репо с историей, например

1. a--b--c--d--1--2--3--4--5  <= notice, duplicate old entry "e" is dropped"

Я также согласился бы на следующее:

2. a--b--c--d--e--1--2--3--4--5            <= duplicate content in "e" and "1"
3. foo--bar--baz--buz--1--2--3--4--5       <= like #1 above, but rehashed "old" history
4. foo--bar--baz--buz--bif--1--2--3--4--5  <= like #4, but "bif" and "1" have duplicate content

То, что я пробовал

Я могу добраться до этой точки (локально) с помощью

cd ~/current-repo
git remote add -f old-repo ~/old-repo
git replace -f --graft 1 d

Теперь,я понимаю, что на данный момент я должен нажать / потянуть refs/replace/*.Я не хочу, чтобы мои пользователи выполняли этот шаг.

Решения git graft (и, возможно, некоторые git replace), которые я видел, имели шаг git filter-branch.Я попробовал это, а также git rebase -ing, но были переписаны только хеши из истории current-repo.Я тоже не хочу этого.Мне все равно, будет ли история из old-repo get перефразирована.Как я уже говорил, это репо не публикуется и не передается.По сути, в следующий раз, когда мои пользователи сделали git fetch, они получат кучу старой истории, в дополнение к той «новой» истории, которую они пропустили.

tl; dr

Я хочу объединить два репозитория git, поддерживая линейную историю и поддерживая хеши «более нового» репозитория.Как мне попасть в хранилище с выбранной историей (см. Выше) или чем-то подобным?

1 Ответ

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

tl; др

Нет, это невозможно.

Подробности

Сохранение хеширования при добавлении ещеистория в начале невозможна, по замыслу.

Хэш sha1 коммита основан на идее криптографической подписи: он хэширует не только коммит и его содержимое, дату, коммиттер и все такое,но он также хэширует родителей, что означает, что он хэширует всю историю, ведущую к этому коммиту.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...