git-subtree push --squash требуется много времени, и с течением времени он становится длиннее - PullRequest
11 голосов
/ 08 марта 2012

Я использую расширение поддерева git (https://github.com/apenwarr/git-subtree). Я использую «--squash», чтобы очистить журнал основного проекта, мои шаги таковы:

  1. добавить lib в основной проект

    git subtree add -P sub / libdir --squash master lib_remote

  2. получить обновление из lib

    git subtree pull -P sub / libdir --squash master lib_remote

  3. отправить изменения в lib_remote

    git поддерево push -P sub / libdir --squash master_b_ libote

Это работает очень хорошо для меня (как основной проект, так и lib, история имеет смысл). Проблема в том, что время git subtree push становится длиннее и длиннее.

Моя цель использования git-subtree почти такая же, как у Screndib, который спросил git-subtree не сохраняет историю, поэтому я не могу отправить изменения поддерева, как я могу это исправить / избежать этой проблемы в будущем?

Я предполагаю, что при использовании --squash каждый раз, когда обрабатывается push, git поддерево должно искать всю историю, начиная с "add поддерева".

Как я могу уменьшить время подталкивания поддерева? Или заставить его работать более эффективно, а не всю историю, только изменения процесса с момента последнего нажатия (или извлечения) git поддерева?

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Я предполагаю, что в вашем коде "lib_remote" URL-адрес удаленного репозитория lib, а не ветка в вашем текущем репо?И URL-адрес удаленного репо, и ветвь в вашем текущем репо работают.

Я вижу, что вы использовали git subtree add для добавления удаленного lib в качестве поддерева, а затем вы просто используете git subtree push для внесения изменений.

Лучше сделать операцию git subtree split, чтобы разделить изменения поддерева на отдельную ветвь в вашем текущем репо перед операцией push, затем переместить разделенную ветвь в удаленное хранилище и сохранить эту разделенную ветвь существующей,каждый раз перед нажатием снова выполните операцию git subtree split, это создаст историю поддерева из точки, которую вы в последний раз разделили, это будет намного быстрее.В противном случае, без этого разделения, как вы сделали, git поддерево должно строить историю поддерева с точки, которую вы добавили, пока поддерево фиксирует рост, время построения будет увеличиваться и увеличиваться.

Если вы не используете --squash при добавлении, вы можете использовать --rejoin во время разделения, это будет намного быстрее.

Итак, шаг должен быть следующим.

  1. добавить lib в основной проект

    добавить поддерево git -P sub / libdir --squash lib_remote_url master

  2. получить обновление из lib

    git поддерево pull -P sub / libdir --squash lib_remote_url master

  3. разделить изменения поддерева на отдельную ветку

    git поддерево split -P sub / libdir -b lib_remote_branch

  4. push изменения в lib_remote

    git push lib_remote_url lib_remote_branch: master

Сохранить существующий lib_remote_branch и повторить шаг3 и шаг 4, когда в следующий раз нажмите.

1 голос
/ 09 апреля 2013

Основная проблема связана с новыми коммитами с разными префиксами, так как вы сделали свое первое добавление.Мое решение этой проблемы состоит в том, чтобы выполнить операцию «очистки», в которой вы фильтруете все свои изменения, которых нет в других репозиториях, а затем добавляете поддерево git в эту новую ветку.

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

...