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

Сохранять историю git при разбиении файла

Я хочу взять функцию из одного файла и поместить ее в другую, но сохраните историю вины.

cp a.php b.php

vim b.php
# delete everything but 1 function

vim a.php
# delete the 1 function

git add a.php b.php
git commit

Но если я запустил git blame b.php, я вижу, что он обвиняет эту новую фиксацию.

4b9b3361

Ответ 1

Возможно, этот предыдущий вопрос SO может быть информативным:

Как git отслеживать исходный код между файлами?

Перефразировать принятый ответ: по существу, git фактически не "хранит" перемещенный код; при создании таких вещей, как обвинения в перемещенном коде, которые выполняются ex post facto, анализируя состояние всего репозитория от фиксации для фиксации.

Ответ 2

Общее правило сохранения истории вины заключается в том, чтобы сделать отдельную фиксацию движения перед любыми изменениями. По моему опыту, это позволяет git blame работать без необходимости в опции -C. Таким образом, в случае разделения файла на новые файлы это можно сделать в двух коммитах:

  • Дублируйте оригинал в новых местах назначения, убедившись, что вы удалите оригинал
  • Удаление дополнительных разделов из дублированных файлов

В представленном примере это будет:

cp a.php b.php
mv a.php c.php
git add a.php b.php c.php
git commit
vim b.php  # delete everything but 1 function
vim c.php  # delete the 1 function
git add b.php c.php
git commit

Ответ 3

попробуйте git blame -C -C b.php

Ответ 4

Я немного изменил ответ Питера на другой вопрос, чтобы создать повторно используемый неинтерактивный скрипт оболочки с именем git-split.sh:

#!/bin/sh

if [[ $# -ne 2 ]] ; then
  echo "Usage: git-split.sh original copy"
  exit 0
fi

git mv $1 $2
git commit -n -m "Split history $1 to $2"
REV='git rev-parse HEAD'
git reset --hard HEAD^
git mv $1 temp
git commit -n -m "Split history $1 to $2"
git merge $REV
git commit -a -n -m "Split history $1 to $2"
git mv temp $1
git commit -n -m "Split history $1 to $2"

Он просто копирует исходный файл в новый файл, и оба файла имеют одинаковую историю. Объяснение, почему это работает, можно увидеть в этом другом ответе