5

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

Я хотел бы иметь все коммиты репо A в репо B, которые касались файла A/a, если я переместил его в B/a. В идеале, если бы я потом переместил A/x в B/x, я бы хотел, чтобы B/a и B/x появлялись вместе в коммитах, которые затрагивали оба файла в хранилище A. Я не ожидал, что у меня будет какой-либо этап разработки A/ слияние с любым из коммитов B, я просто хочу, чтобы они появились там потом.

Спасибо, всего наилучшего

3 ответа3

5

Предположим, вы хотите перенести историю filename.conf из одного исходного репозитория в другой принимающий репозиторий. Я думаю, что стратегия, которой вы хотите следовать:

  1. В исходном репозитории создайте ветвь коммитов, которые переписываются так, чтобы содержать только filename.conf .
  2. Объедините независимую строку коммитов в обычную ветку в принимающем репозитории.

Обязательно сделайте резервные копии ваших репозиториев, прежде чем сделать это!

В исходном репозитории используйте filter-branch для перестройки истории, удалив все, кроме filename.conf .

git checkout -b filtered-commits
git filter-branch -f --prune-empty --tree-filter 'find . -not -name filename.conf -exec rm {} \;' filtered-commits

Затем в принимающем хранилище:

git pull path/to/source/repo

Если вам также необходимо переместить путь, по которому находится filename.conf в репозитории, вам, вероятно, потребуется использовать параметр --subdirectory-filter в git filter-branch .

0

Я думал о чем-то подобном для Mercurial на днях. Я думаю, что я написал бы скрипт (возможно, python, но на самом деле все, что может выполнять команды оболочки) для:

  1. Для каждой ревизии, которая коснулась файла X (назовите его «#rev»)
    1. Скопируйте файл X из #rev в новое место
    2. Совершить в новом репо с сообщением от #rev

Было бы неплохо, если бы скрипт позволял редактировать комментарии и "забывать" некоторые версии, где это необходимо.

0

Поскольку git filter-branch может быть невыносимо медленным для большого репозитория, этот трюк с использованием git log , git format-patch и git am может быть полезной альтернативой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .