Сохраняйте историю мерзавцев при разбиении файла - PullRequest
30 голосов
/ 08 октября 2010

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

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, я вижу только обвинение в этом новом коммите.

Ответы [ 4 ]

18 голосов
/ 30 ноября 2015

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

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

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

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
6 голосов
/ 08 октября 2010

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

Как исходный код git-трека перемещается между файлами?

Перефразируя принятый ответ: по сути, Git не делаетна самом деле «хранить» перемещенный код;при генерации таких вещей, как обвинения в перемещенном коде, это делается ex post facto , проверяя состояние всего репозитория от commit до commit.

5 голосов
/ 08 октября 2010

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

1 голос
/ 19 декабря 2018

Я немного изменил Ответ Питера на другой вопрос здесь , чтобы создать повторно используемый неинтерактивный скрипт оболочки с именем 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"

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

...