git: копировать (cherry-pick) историю одного репозитория в каталог другого - PullRequest
0 голосов
/ 10 января 2019

У меня есть два репо. Первый репо (назовем это A) начался некоторое время назад; Второй репо (B) начался совсем недавно. Теперь мы думаем, что лучше сделать B подкаталогом A. Поэтому я бы хотел это сделать, но сохранить историю коммитов B.

  • Я хочу полную историю коммитов. то есть я не хочу просто раздавить историю B в одном патче и добавить ее как новый коммит в A.
  • Мне все равно, чтобы сохранить точные SHA1 для B (я понимаю, что это, вероятно, невозможно).
  • Мне все равно, чтобы сохранить временные метки коммитов Б. (хотя это было бы неплохо иметь).
  • Мне все равно, чтобы сохранить авторство.
  • Я просто хочу сохранить различия / патчи каждого из коммитов B.
  • Мне не важно сохранять какое-либо представление о двух отдельных репозиториях. На самом деле, я хочу, чтобы вперед был только А.
  • Мне не нужно, чтобы B был git-подмодулем A, с его собственным .git dir или чем-то подобным.

В конце выполнения любых операций я хочу выполнить три критерия:

  1. Файлы и каталоги, видимые в HEAD из B, находятся в подкаталоге A, т.е. /path/to/repoB/somefile.js находится в /path/to/repoA/B/somefile.js
  2. Все сообщения о коммитах B отображаются по порядку в хронологическом конце коммитов A
  3. Доступны различия каждого коммита (доступны для просмотра git log и т. Д.)

Некоторые примеры могут прояснить, что я намереваюсь:

  1. В репо B, коммит 1 должен добавить file.txt
  2. коммит 2 предназначен для редактирования file.txt
  3. Итак, в репо А я хочу два новых коммита:
  4. репо А коммит 98: добавить B/file.txt
  5. repo A commit 99: edit B/file.txt

EDIT:

Объединить git-репозиторий в подкаталоге было предложено в качестве дубликата моего вопроса. Я признаю, что это очень близко к тому, что я спрашиваю, и имеет несколько хороших ответов. Я попытался ответить на вопрос subtree и ответ rebase --onto. Оба были очень близки, но были неудовлетворительными: subtree не позволял git log просматривать историю через истории репозитория, не ссылаясь на path/to/file/without/repo-subdir (где я переместил B в repo-subdir); и rebase --onto не делали историю B видимой из HEAD.

.

1 Ответ

0 голосов
/ 10 января 2019

Вот что я в итоге сделал. Спасибо atrus из #git в Freenode (IRC) за то, что направили меня в правильном направлении.

  1. В репо B создайте новую ветку: git checkout -b indir
  2. В репо B, mkdir b-subdir, где b-subdir - каталог, в который я намерен попасть B, в дереве каталогов A.
  3. В репо B, git mv [...] b-subdir, чтобы переместить все (кроме .git/ и b-subdir/ непосредственно) в b-subdir.
  4. Передайте этот ход в репо B.
  5. Push to origin (push -u origin HEAD).
  6. В репо A : git remote add repo-b ssh://......../repo-b.git
  7. git fetch repo-b
  8. git merge --allow-unrelated-histories repo-b/indir

Это позволяет мне видеть полную историю произвольных файлов, которые были получены из репозитория B (с помощью переключателя --follow git log) без , не требующего удаления префикса b-subdir/ из пути к файлу , При git subtree история файла в B отображается только в том случае, если вы удаляете ее (а в A - если нет).

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