2017-01-21 11 views
1

У меня есть проект monorepo proj с использованием поддеревья в папке sub под proj/sub. Я сделал тонны коммитов, которые касаются как proj, так и sub. Как опубликовать соответствующие изменения в верхнем потоке sub?Git фиксирует то, что касается поддерева/подпапки

Обычно, я должен был бы вишневым выбрать каждую фиксацию с помощью

git cherry-pick -x --strategy=subtree -Xsubtree=sub/ commit-ref

, но я сделал несметные фиксации, так что это неосуществимо. Как я могу интегрировать изменения в sub сразу? Например, создайте один большой сжатый коммит, который принесет sub в то же состояние, что и в моем monorepo.

по теме: View commits that make changes to subfolder, How to cherry pick a range of commits and merge into another branch

+0

Поскольку ваша работа имеет много фиксаций, я думаю, что ваш исходный код имеет большое количество конфликтов , Я думаю, вы должны использовать внешний инструмент сравнения и слияния, например Beyond Compare 4 или WinMerge, в сочетании с IDE. –

+1

Вам нужно сохранить автора и комментарии коммитов? – jbu

+0

@jbu было бы неплохо, не раздавлено даже лучше, если фиксация касается обоих proj и sub, она должна поддерживать сообщение, но только соответствующие дельта. Идеально. – rfabbri

ответ

2

Текущее решение: в основном перебазироваться

Несколько rebases с парой cherrypicks будет делать, но до сих пор я не нашел автоматизированный способ с помощью одной команды. Используйте

git rebase -s subtree -Xsubtree=sub --onto sub_master proj_ini proj_end 

скопировать на подпроект основной ветви sub_master всех верхние уровень proj коммитов исх proj_ini (эксклюзив) по рефу proj_end (включительно). Филиал, в котором вы находитесь, не имеет значения. Для каждой фиксации, эти вещи могут произойти:

  1. Подтверждает, что прикосновение только подпроект sub будет скопирован чисто
  2. Фиксации, которые касаются только файлы за пределами sub не будет отображаться. Поскольку мы перезаряжаем, они молча игнорируются. Если бы вишневый выбрать этот тип фиксации, произойдет ошибка говорить, что пустые фиксации не разрешено (в будущих версиях Git могут иметь git cherry-pick --skip-empty)
  3. коммитов, которые имеют изменения в обоих sub и вне его будет скопированы с точно такое же сообщение, но только соответствующие изменения/файлы хранятся, остальное чисто игнорировали
  4. переименовывает/перемещается от proj к sub являются чисто переписать в виде творений
  5. Merge фиксаций в основном чисто приходилось, с некоторыми исключениями

    5.1 Явно проигнорировать последнее слияние, которое вы сделали с мастером proj, исходящим от sub.

    5,2 Явное объединить некоторые слияния коммитов, которые вовлеченные разрешения конфликтов, используя cherrypick (текущая ветвь должна быть sub_master):

    git cherry-pick -x --strategy=subtree -Xsubtree=sub -m 2 merge_ref 
    

    где -m обычно 1 или 2 для каждого родителя.(На практике я буду слепо попробовать либо один и git cherry-pick --abort и попробовать другой, если я получаю конфликты или нежелательные изменения)

1

так вишневый выбор может на самом деле взять в нескольких совершающих-в нуле, вы могли бы просто сделать git log [<options>] [<revision range>] -- sub и формат вывод просто напечатать хеш сумму? Подайте список в git cherry-pick -x --strategy=subtree -Xsubtree=sub/ <list of commits>. Вы просто пытаетесь выполнить эту задачу с меньшим количеством команд? Если это так, это может сработать, хотя я никогда не делал этого лично.

+0

Вишня выбирает диапазон, который не так хорош, как перезагрузка в основном потому, что он в настоящее время терпит неудачу, если какие-либо коммиты в диапазоне приводят к пустым фиксациям к 'sub' – rfabbri

+0

, и я не мог устроиться вслепую подачу списка из' git log' из сильно нелинейной истории, полной сливаний в вишневый выбор – rfabbri