Сделать git `replace` постоянными (или такими)

Я занят преобразованием всех моих существующих репозиториев SVN в Git, и в то же время также пользуюсь возможностью использовать способность Git легко переписать некоторую историю. Для этого я также использую git filter-repo, чтобы избавиться от ненужных файлов и выполнить стандартное переименование с помощью скриптов. (примечание: все они являются сольными репозиториями, в которых работаю только я, поэтому никаких заявлений об отказе от ответственности, изменяющих историю, не требуется, я знаю предостережения :))

filter-repo работает прекрасно (с возможностями сценариев Python, а также намного быстрее, чем filter-branch), но создает коммиты замены. Как только реструктуризация репо будет завершена, я хотел бы снова избавиться от всех этих коммитов замены, чтобы действительно сохранить измененную историю. И желательно через скрипт, так как у меня много репозиториев с кучей коммитов. Однако я оказался с пустыми руками, когда гуглил, как это сделать...

Причина этого: моего клиента командной строки Git это не беспокоит, но мой графический интерфейс (SmartGit для Windows) продолжает ныть, что он не поддерживает замену коммитов (он обнаружил refs/replace-refs, как он говорит). В любом случае он отображает содержимое репо в порядке, и я могу продолжить заполнение отсутствующих сообщений фиксации, выполнить дополнительную очистку и т. Д., Но я еще не смотрел дальше, так что кто знает, что это в конечном итоге сломается?

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


person Carl Colijn    schedule 08.10.2020    source источник
comment
Если git filter-repo не имеет возможности для этого (я был бы немного удивлен, если нет, но это все еще продолжается, и я на самом деле не смотрел ), вы можете просто запустить окончательный вариант в основном без операций (без фильтров, кроме --tag-name-filter, если у вас есть имена тегов) git filter-branch в конце, чтобы закрепить все замены.   -  person torek    schedule 09.10.2020
comment
@torek: оказывается, это действительно так; см. ответ VonC. И, безусловно, кажется, что большинство любых действий, которые вы предпринимаете с репозиторием, используя инструменты, которые не поддерживают replace-refs, закрепят замены, но я был немного не уверен, не сломает ли это что-то по незнанию... Загрузка на локальный сервер Gitea работает для меня (и клонирует его заново), а также изменение сообщения коммита в более старой фиксации с использованием SmartGit (я полагаю, он вызывает для меня ветвь фильтра под капотом). Но оба являются относительно медленными и/или ручными действиями; поэтому мой вопрос. Спасибо, в любом случае!   -  person Carl Colijn    schedule 09.10.2020


Ответы (1)


Если refs/replace-refs вызывает проблемы, вы можете запустить команду filter-repo с помощью
--replace-refs вариант.

Попробуйте с:

--replace-refs update-no-add
# or
--replace-refs delete-no-add

Посмотрите, есть ли еще refs/replace-refs объектов после выполнения filter-repo.

person VonC    schedule 09.10.2020
comment
Спасибо за это! До сих пор я просматривал общий документ для filter-repo по адресу github.com/newren/git-filter-repo/blob/main/Documentation/, но на эту тему очень кратко. В любом случае, и delete-no-add, и update-no-add покидают репозиторий без каких-либо следов замены ссылок. Глядя на документ, я полагаю, что delete-and-add удалит предыдущие ссылки на замену, но добавит новые для текущей перезаписи? И что update-no-add будет только обновлять существующие, но не добавлять новые? - person Carl Colijn; 09.10.2020
comment
@CarlColijn Я думаю, что ваша интерпретация этих вариантов верна. - person VonC; 09.10.2020