Сохранять историю 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
, я вижу, что он обвиняет эту новую фиксацию.
Ответы
Ответ 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"
Он просто копирует исходный файл в новый файл, и оба файла имеют одинаковую историю. Объяснение, почему это работает, можно увидеть в этом другом ответе