LINUX.ORG.RU

Как в git'е перейти с одного дерева на другое с сохранением истории?

 , ,


0

2

В общем, говорят, что сабжевый вопрос вполне решаемый, но я пока ещё не настолько хорошо знаю git.

Итак, что дано? Создаём git'овый репозиторий. В директорию project извлекаем исходники из тарбола. Добавляем ещё файлов. Создаётся свой уникальный .git с историей.

Потом, внезапно, надо перейти на другую форму репозитория. То, что извлекалось из тарбола, клонируется из git'ового репозитория прямо в корень (с потерей прежней директории .git), но сюда же нужно добавить и прежнее дерево другой веткой, чтобы старая история также добавилась в новую, при этом из старой истории в новое дерево извлекаются директория и ряд файлов.

Есть подсказка: несовместимые истории тут можно объединить через git merge с ours без коммита (но я пока плохо понимаю что это значит).

★★★★★

Ты точно понимаешь, как работает гит? И что это вообще такое?

  1. Создаешь каталог, в котором инициируешь новый пустой репозиторий: git init.
  2. Распаковываешь туда свой тарбол, коммитишь изменения, можно прямо в мастер: commit.
  3. Делаешь че надо, снова коммитишь изменения. В итоге у тебя мастер с нужными тебе версиями файлов, и вообще все, что ты делал.
  4. Снова распаковываешь тарбол в корень и коммитишь: вот тебе последний коммит с сохранением истории репы.

Сам каталог .git трогать при этом не надо вообще.

Ну или я твою задачу не понял вообще.

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Ну или я твою задачу не понял вообще.

Да. Задача в том, чтобы перейти с одного на другое.

Изначально был репозиторий, можно сказать, с нуля, т.е. созданный через «git init».

А теперь нужно перейти на другую форму: склонировать добавляемые исходники из git'а прямо в корень, и уже туда, в чужой git'овый репозиторий, добавить своё старое дерево с историей.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от Zhbert

Для того, что это переход со «сборки из тарбола» на «сборку из git'а». Директория .git может быть только одна. Если склонировать git'овый репозиторий в поддиректорию, то эта апстримная директория project/.git в дерево просто не добавится.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Для того, что это переход со «сборки из тарбола» на «сборку из git’а»

А можно поподробнее? Мб есть другой путь?

склонировать git’овый репозиторий в поддиректорию

В корень. И не склонировать, а просто залить туда исходники.

Zhbert ★★★★★
()
Последнее исправление: Zhbert (всего исправлений: 1)
Ответ на: комментарий от Zhbert

А надо именно клонировать, чтобы имеющееся в репозитории позволяло делать «git pull» для тех исходников, которые раньше были из тарбола. Можно, конечно, добавить историю проекта отдельной веткой, но это менее правильно.

Так что, другого пути, по сути, нет.

saahriktu ★★★★★
() автор топика

Нужно историю над содержимым тарболла заребейзить на тот коммит из которого был сделан тарболл, а потом смержить эти две ветки.

anonymous
()

То, что извлекалось из тарбола, клонируется из git’ового репозитория прямо в корень

ЯННП. Ты хочешь влить код из какой-то внешней репы апстрима? Сделай отдельный remote и отдельную ветку для него. Потом вытягиваешь оттуда в эту ветку апстрим код и сливаешь в свою.

no-such-file ★★★★★
()
Ответ на: комментарий от saahriktu

старая репа мержится с клоном репозитория. Такова задача.

И что в моём предложении этому не соответствует?

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

в каталоге со «своим» гитом создаешь новую ветку с именем, не существующим в новой репе, переключаешься на нее. Добавляешь remote от новой репы. Опционально сносишь свой мастер. Делаешь git fetch <новый remote>. Получаешь у себя два дерева, мержишь как обычно.

arkhnchul ★★★
()

В общем, решил с другой стороны так:

<Чистка дерева>
git remote add upstream <URL апстрима>
git remote update
git merge -s ours --allow-unrelated --no-edit upstream/master
[опционально "git rebase upstream/master"]

saahriktu ★★★★★
() автор топика