Ответ 1
TL; DR
Вперед: перемещайте файлы и каталоги. Просто убедитесь, что вы не делаете никаких изменений в файлах в одном и том же коммитах, как ваша реструктуризация каталога.
Почему это работает
Git - это трекер контента, а не трекер. Если вы перемещаете/переименовываете файлы, но не делаете никаких других изменений в содержимом этих файлов, тогда Git just перезаписывает древовидные объекты. Файловые капли не изменяются операциями каталога; информация о местоположении каталога хранится отдельно в древовидных объектах.
Фактическое обнаружение переименования обрабатывается отличными блоками и деревьями и ищет настраиваемый процент сходства между файлами. Это означает, что Git на самом деле не сохраняет ходы или переименовывает напрямую; он вычисляет их из различий между фиксациями.
Результат всего этого заключается в том, что ваша история не привязана к определенному имени файла или структуре каталогов. Это работает очень хорошо для большинства случаев использования, но контрастирует с такими системами, как Bazaar, которые отслеживают переименование как операции первого класса.