Переместите части файла в другие файлы и сохраните историю git

#git

Вопрос:

У меня есть большой файл со сложной историей (много коммитов от многих авторов).

Рефакторинг предполагал бы разделение его на несколько небольших файлов, НО мне нужно сохранить историю.

Чтобы исправить эти идеи, предположим, у меня есть main файл, содержащий весь мой код :

 function a() {}
function b() {}
function c() {}
function main() {
   a();
   b();
   c();
}
 

и мне нужно переместить функции a и b функции в a b файлы и, соответственно, сохраняя мою main функцию в main файле-сохраняя историю в трех файлах.

Я нашел там какое-то решение, но ничего, что действительно работает или практично в производственной среде.

Комментарии:

1. Что произошло, когда вы последовали методу, на который вы ссылались? Неужели история оказалась не такой, как вы ожидали? Или вам не понравился какой-то побочный эффект этого?

2. @IMSoP слишком сложный и трудоемкий процесс. У меня есть несколько больших файлов, которые мне нужно разделить на несколько вложенных файлов

3. Я бы рекомендовал не пытаться сохранить такого рода историю. Как вы обнаруживаете, это может усложнить простые изменения. Вы тратите на порядок больше времени на изменение кода, чем на археологию кода, поэтому нет смысла оптимизировать для археологии кода.

4. Если вы хотите позже просмотреть историю, просмотрите историю исходного файла.

5. Обратите внимание, что в Git нет такой вещи, как «история файлов»: фиксации- это история, и это все, что есть. Программы любят git log и git blame пытаются создать историю файлов, читая фактическую историю (фиксации); степень их успеха в некоторой степени зависит от наблюдателя.

Ответ №1:

Переместите код как обычно. Git может помочь вам прочитать историю.

Воспользуйся git blame -w -n -M -C -C -C . Мне нравится называть это так archeology .

  • -w игнорирует тривиальные изменения пробелов.
  • -n показывает номер строки исходной фиксации.
  • -M обнаруживает перемещенные или скопированные строки в файле.
  • -C -C -C обнаруживает строки, перемещенные или скопированные из других файлов в любой фиксации.

Аналогично, используйте git log -w -M -C -C -C .

Вы также можете упростить археологию, скопировав код в одном коммите и изменив его в следующем. Затем, когда вы просматриваете историю обвинений, вы нажмете на фиксацию с надписью «разделить файл X».

В конечном счете, вы тратите на изменение кода на порядки больше времени, чем на археологию кода. Нет смысла оптимизировать процесс разработки для археологии кода. Вместо этого измените код по мере необходимости и используйте Git более эффективно. И если, в конце концов, археология немного сложнее, это нормально; это лучше, чем усложнять разработку.

Раньше, чем вы думаете, особенно если вы примете изменения как нормальную часть развития, никому не будет дела до того, откуда взялись исходные линии.