Сократите время на то, чтобы нажать поддерево
Я использую git в мой проект, который состоит из нескольких подпроектов. Каждый подпроект "связан" в основном проекте с использованием git-subtree. То, что мой способ реализовать "svn externals" в git. Я использую его с нескольких недель, но время, оттачивающее мои изменения от поддерева до удаленного места, увеличивается во время каждой фиксации. Это выглядит так, когда я нажимаю изменения, используя команду
git subtree push -P platform/rtos rtos master
git push using: rtos master
1/ 215 (0)2/ 215 (1)3/ 215 (2)4/ 215 (3)5/ 215 (4)6/ 215 (5)7/ 215 (6)8/ 215 (7)9/ 215 (8)10/ 215 (9)11/ 215 (9)12/ 215 (10)13/ 215 (11)14/
....
20 more lines
....
(204)209/ 215 (205)210/ 215 (206)211/ 215 (207)212/ 215 (208)213/ 215 (209)214/ 215 (210)215/ 215 (211)To https://github.com/rtos/rtos.git
64546f..9454ce 9a9d34c5656655656565676768887899898767667348590 -> master
Есть ли способ "очистить" поддерево и, следовательно, уменьшить время, нажимающее изменения?
Ответы
Ответ 1
Обратите внимание, что если вы решите перейти на git submodule
, теперь вы можете с git1.8.2 (2013-03-08) отслеживать последние коммиты репозитория подмодуля.
Смотрите git внешние.
Подмодуль "git начал изучать новый режим для интеграции с концом удаленной ветки (в отличие от интеграции с фиксацией, записанной в суперпроекте gitlink).
Это может быть сделано для более быстрого нажатия, в то время как при использовании дополнительной информации подмодуль имеет над поддеревом (то есть легкую запись конкретного фиксации подмодуля)
Вы можете обновить этот подмодуль до последней из данной ветки с помощью:
git submodule update --remote
Эта опция действительна только для команды update
.
Вместо использования суперпроекта, записанного SHA-1 для обновления подмодуля, используйте состояние ветки удаленного отслеживания подмодуля.
Ответ 2
Попробуйте использовать флаг --rejoin
, так что после разделения поддерево будет правильно объединено обратно в основной репозиторий. Таким образом, каждый раскол не должен проходить всю историю.
git subtree split --rejoin --prefix=<prefix> <commit...>
В исходной документации поддерева:
После расщепления объедините вновь созданный синтетический историю в ваш основной проект. Таким образом, будущее расколы могут искать только ту часть истории, которая имеет был добавлен с самого последнего --rejoin.
Ответ 3
Нет, к сожалению нет. Когда вы запустите git subtree push
, он воссоздает все фиксации для этого поддерева. Это необходимо сделать, поскольку их SHA зависит от предыдущего фиксации и требует, чтобы эти SHA могли связывать новые коммиты со старыми. Он может кэшировать его, но он этого не делает.
Я предполагаю, что это цена, которую вы платите за использование поддерева против подмодулей. Subtree очень неактивен в вашем репозитории, что приятно на руке, но с другой стороны вызывает это длительное вычисление. Субмодули хранят всю свою информацию, что требует от вас управления, но также делает вещи, подобные этому, намного быстрее.
Ответ 4
Может быть, это помогает: я думаю, вы можете сказать git subtree split
только вернуться к n коммитам, выполнив
git subtree split --prefix XXX HEAD~n..
или указав фиксацию, с которой вы хотите начать, например,
git subtree split --prefix XXX 0a8f4f0^..
Это помогает сократить время, хотя оно неудобно.