Подтвердить что ты не робот

Сократите время на то, чтобы нажать поддерево

Я использую git в мой проект, который состоит из нескольких подпроектов. Каждый подпроект "связан" в основном проекте с использованием git-subtree. То, что мой способ реализовать "svn externals" в . Я использую его с нескольких недель, но время, оттачивающее мои изменения от поддерева до удаленного места, увеличивается во время каждой фиксации. Это выглядит так, когда я нажимаю изменения, используя команду

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

Есть ли способ "очистить" поддерево и, следовательно, уменьшить время, нажимающее изменения?

4b9b3361

Ответ 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^..

Это помогает сократить время, хотя оно неудобно.