Я хотів би об’єднати віддалене сховище git у своєму робочому сховищі git як його підкаталог. Я хотів би, щоб результуюче сховище містило об’єднану історію двох сховищ, а також щоб кожен файл об’єднаного сховища зберігав свою історію, як це було у віддаленому сховищі. Я спробував використати стратегію піддерева, як згадано в розділі Як використовувати стратегію злиття піддерев , але після дотримання цієї процедури, хоча отримане сховище дійсно містить об’єднану історію двох сховищ, окремі файли, що надходять із віддаленого, не зберегли свою історію (`git log 'на будь-якому з них просто показує повідомлення" Об'єднана гілка ... ").
Крім того, я не хочу використовувати підмодулі, оскільки я не хочу, щоб два комбіновані сховища git більше були окремими.
Чи можна об'єднати віддалене сховище git в інше як підкаталог з окремими файлами, що надходять із віддаленого сховища, зберігаючи свою історію?
Велике спасибі за будь-яку допомогу.
EDIT: Зараз я випробовую рішення, яке використовує git filter-branch для переписування об’єднаної історії сховища. Здається, це працює, але мені потрібно ще трохи перевірити. Я повернусь, щоб повідомити про свої висновки.
РЕДАГУВАТИ 2: Сподіваючись, я зрозумію більше, я даю точні команди, які використовував у стратегії піддерева git, що призводить до очевидної втрати історії файлів віддаленого сховища. Нехай A - це репозиторій git, в якому я зараз працюю, а B - репозиторій git, який я хотів би включити в A як його підкаталог. Він зробив наступне:
git remote add -f B <url-of-B>
git merge -s ours --no-commit B/master
git read-tree --prefix=subdir/Iwant/to/put/B/in/ -u B/master
git commit -m "Merge B as subdirectory in subdir/Iwant/to/put/B/in."
Після цих команд і переходу в каталог subdir / Iwant / to / put / B / in, я бачу всі файли B, але git logна будь-якому з них відображається лише повідомлення коміту "Merge B as subdirectory in subdir / Iwant / to / put / B / in ". Їх історія файлів, як у B, втрачена.
Що , здається , на роботу (так як я новачок на мерзотник я можу помилятися) , полягає в наступному:
git remote add -f B <url-of-B>
git checkout -b B_branch B/master # make a local branch following B's master
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&subdir/Iwant/to/put/B/in/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
git checkout master
git merge B_branch
Наведена вище команда для фільтра-гілки взята з git help filter-branch, в якій я лише змінив шлях до піддирекції.
gitkговорить про історію? Раніше я успішно використовував злиття піддерев git. Можливо, ви можете розкрити свої точні команди? Я не впевнений, що git-filter-branch є правильним підходом. Я можу рекомендувати спробувати git-fast-export та git-fast-import для синтезу нової історії.