Лучший способ перебазировать поверх репо со многими перемещенными файлами? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть две ветви A и B.

Я начал с позиции, где ветвь B примерно на 200 коммитов перед ветвью A.

В то же время, многие файлы в ветке Aбыли перемещены, например, файлы Java из src/org/** были перемещены в module1/src/main/java/org/**, а файлы не из Java в module1/src/main/resources/**.

У меня есть список всех перемещенных папок и файлов.

Я хотел бы перебазировать Ветвь B поверх Ветви A. Как правило, я бы сделал что-то вроде:

git fetch upstream && git checkout B && git rebase upstream/A

Однако это не относится чисто, так как Ветвь B одновременно добавляет новые файлы и изменяетсуществующие файлы в src/org, но некоторые из них были перемещены (с git mv) в ветвь А.

Есть ли способ, которым я могу сказать git обо всех перемещенных путях, когда он выполняет ребаз,например, когда вы создаете новый файл в src/org, вместо этого теперь создайте его в module1/src/main/java/org?

Или лучше будет создать большой набор патчей из ветви B с использованием git format-patch, затем выполнитенайти и заменить во всех файлах патчей, чтобы обновить пути, прежде чем применятьОтправьте их в новую ветвь А?

Или, может быть, есть другой путь полностью?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

В итоге я сделал:

  1. git checkout B
  2. git format-patch -o patches / HEAD ~ 198
  3. Вся нагрузка Sed противпатчи
  4. git checkout A
  5. git checkout -b new-B
  6. git am -3 патчи / *

Это было относительно безболезненноПозор, что нет лучшего способа, комбинируя ребаз / фильтр.

0 голосов
/ 21 февраля 2019

Если вы попробуете git checkout a && git rebase b, вы получите файлы, в которых git запутался, верно?

Чтобы минимизировать время, когда git запутывается из-за переименования при сохранении обеих веток ... Я думаю, я быпопробуйте двойной цикл ... на самом деле, это даже одна идея для хорошего git-скрипта .... скажем, что A - точка отвлечения между B и C ... скажем, есть 5 ревизий между A и B и 20 между Aи C.

Вместо того, чтобы перебрасывать C поверх B, я сначала базируюсь на B ~ 4, затем перебазирую полученную ветвь поверх B ~ 3, затем снова поверх B ~ 2,затем B ~ 1, наконец, над B. Это много работы, но, вероятно, git будет меньше путаться при попытке сопоставить файлы, которые вы перемещали .... и ребаз обычно выполняютсябыстрее, чем щелкать пальцами, поэтому это не должно быть слишком больно.

...