Все, что вы делаете, будет довольно уродливым, так как Git на фундаментальном уровне знает, какими должны быть имена файлов. Дерево с разными именами файлов имеет другой SHA1, так что коммиты тоже делают, и ничто не будет совпадать. Это означает, что на GitHub на самом деле нет ничего разумного, так как необходимо много переписывать историю.
Есть две основные вещи, которые вы можете попробовать сделать.
One: используйте git filter-branch
с древовидным или индексным фильтром, чтобы переписать всю историю в одном репо, переименовав файлы. Вы можете прочитать документацию или выполнить поиск в Интернете или здесь, чтобы найти примеры этого. В man-странице есть пример, который довольно близок к вашему варианту использования, последний в разделе примеров, который перемещает все файлы в подкаталог, делая это таким образом, который в основном эквивалентен удалению или добавлению префикса. Ваша версия может быть что-то вроде:
git filter-branch --index-filter \
'git ls-files -s | sed "s/module-x/gallery-module-x/" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
(Шаблон замены sed - это то место, где вам нужно быть осторожным.) Вы бы хотели запустить его в новом клоне, чтобы не переписывать ветви в исходном репо.
Если вы работаете в обоих репозиториях, для синхронизации потребуется много тщательной работы, чтобы избежать несоответствия между двумя репозиториями, и вам придется выполнить обратное преобразование, чтобы вернуть вещи в другую сторону. Но если открытый / общедоступный только для чтения, то эта опция замечательна; думайте о ветке фильтра как о предвестнике экспорта. Сохраните сценарий, чтобы сделать это, и все, что вам нужно сделать, это клонировать, разветвить фильтр и нажать.
Два: перенос патчей вручную. Вы можете использовать git format-patch <revision-range>
для создания исправлений, затем выполнить автоматическую замену имен файлов в этих исправлениях, а затем применить их в другом хранилище. Это некрасиво, но работает.
Я полагаю, что вы могли бы запускать любую из этих вещей с помощью ловушки после фиксации локально, но они могут занимать больше времени, чем вы хотите, так как вы, вероятно, будете часто фиксировать и захотите двигаться немедленно. Еще один вариант, который, я полагаю, вы уже рассмотрели и отклонили по какой-то причине, заключается в том, чтобы использовать существующий сценарий, запущенный из ловушки после фиксации, для копирования / переименования файлов в другое хранилище и немедленной фиксации там. (Один коммит на коммит, а не один большой коммит на несколько коммитов.)