Сплит репо с помощью git filter-branch: как восстановить историю из переименованных / перемещенных файлов? - PullRequest
5 голосов
/ 18 декабря 2010

Отказ от ответственности: я видел Отсоединение (перемещение) подкаталога в отдельный репозиторий Git , но он не полностью отвечает на вопрос.

Я перенес проект из svn в git,Когда он жил в svn, некоторые файлы были перемещены и / или переименованы.

После миграции git некоторые коммиты видны только с git log --follow

, поэтому:

структура git выглядит следующим образом:

MyMainRepo/
.git/
XYZ/
ABC/myFile.txt

git log ABC/myFile.txt show: - commit1 - commit2

git log --follow ABC/myFile.txt показывает: - commit1 - commit2 - commit3 (каталог ABC не существуеттогда) ...

теперь, когда делим репозиторий git на отдельный репозиторий git репозитория ABC: git log --follow ABC/myFile.txt теперь потерял старую историю, и у меня просто есть:

  • commit1
  • commit2

Что бы я хотел:

  • разделить ABC от MyMainRepo,
  • без потери истории

Любая помощь приветствуется:)

Ответы [ 2 ]

1 голос
/ 13 апреля 2012

Я только что столкнулся с той же проблемой и не смог получить полную историю перемещенной папки, даже с индексным фильтром.

Мой обходной путь - сделать отдельный экспорт subdir папки (ABC), которая была перемещена в точку до ее перемещения, и затем перенести историю этого хранилища в новый.

Допустим, ABC раньше назывался MNO. Я клонирую MyMainRepo, возвращаюсь к версии, когда MNO еще существовал (до того, как он был переименован в ABC). Я делаю ответвление фильтра с помощью subdir, чтобы получить хранилище с именем "MNO".

Внутри ABC я делаю git fetch ../MNO.

Затем я ввожу коммит, когда содержимое было перемещено в ABC (это будет первый коммит с содержимым в репо ABC), плюс последний коммит в репозитории MNO в .git/grafts.

Теперь я могу сделать git log для файлов внутри ABC и увидеть историю, прослеживающую весь путь, как это было в MNO. Следующий шаг - сделать еще одну ветку фильтра, чтобы сделать ее постоянной прививкой и т. Д. Я сделал скринкаст, который демонстрирует прививку здесь (хотя контекст немного отличается):

http://blog.tfnico.com/2010/10/gitsvn-6-grafting-together-svn-history.html

Обратите внимание, что это должно быть сделано для каждой перемещаемой папки, это большая работа, и в итоге вы получаете коммит слияния для каждого случая. Но git log работает.

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

0 голосов
/ 31 января 2011

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

...