Может ли Git реструктурировать мои папки без потери истории?

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

текущий корневой каталог

main ->
  src
  res

новый корень

main ->
  app1
    src
    res

Как я могу сделать это в Git на Windows, не теряя свою историю?

 Michael Freidgeim25 янв. 2016 г., 22:14
Подобный вопросstackoverflow.com/questions/2314652/…
 IsmailS21 авг. 2014 г., 17:09
просто делатьgit add -A . после того, как вы переместили папку / файлы. Убедитесь, что вы не вносите никаких изменений.
 rfabbri06 нояб. 2016 г., 23:44
@ Кенни Остром не правда,git add {empty directory} это НООП. В любом случае, этоsucks использовать--follow только потому, что мы переместили файлы
 jlilja31 мая 2012 г., 08:18
This answer показывает, как просмотреть историю перед переименованием / перемещением.
 Kenny Ostrom15 июн. 2016 г., 23:20
У меня были похожие проблемы. Кажется, что во всех ответах отсутствуют некоторые детали, но они помогли мне разобраться. Мне пришлось mkdir, git add {directory}, git mv ..., git commit, затем проверить старые истории с помощью git log --follow filename. Указание git добавить новый каталог перед перемещением в него файлов имело большое значение, даже если он был пуст и состояние git не отображало его до или после. (Это должен быть ответ, но я не собираюсь добавлять новый ответ через 4 года.)

Ответы на вопрос(2)

Вы можете просто переместить файлы, и Git заметит (или должен) заметить, что это произошло. Это сохранит историю.

Если оноdoesn't заметить движение по какой-то причине, вы можете попробовать использовать diff с--find-copies-harder вариант.

 31 мая 2012 г., 08:17
Этот ответ правильный. Git может вам немного помочь, если вы это сделаетеmkdir app1 && git mv src res app1 && git commit, Предполагая, что у вас есть несколько файлов в обоихsrc а такжеres (если нет, git игнорирует пустые директории).
Решение Вопроса
TL;DR

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

Why It Works

Git - это трекер контента, а не трекер файлов. Если вы перемещаете / переименовываете файлы, но не вносите никаких других изменений вcontent из этих файлов, то Git простопереписывает объекты дерева, Файловые капли не изменяются при работе с каталогами; Информация о местонахождении каталога хранится отдельно в древовидных объектах.

Фактическое обнаружение переименования обрабатываетсяразнося капли и деревьяи ищет настраиваемый процент сходства между файлами. Это означает, что Git не хранит ходы и не переименовывает напрямую; Этоcomputes их от различий между коммитами.

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

 29 июл. 2014 г., 15:57
При переименовании родителя я теряю историю на дочерних файлах?
 10 июл. 2016 г., 09:37
@CodeGnome git отслеживает изменения и движения. Я сделал небольшую проверку, и, кажется, это работает. Вы можете проверить этот коммитgithub.com/aoancea/git-history/commit/…
 15 июн. 2016 г., 23:23
Git обнаружил только переименования, сделанные с помощью git mv, для меня. Кроме того, так как исходный вопрос касался mkdir (и моя проблема была похожей), мне пришлось выполнить команду git add {empty directory name} перед перемещением файлов.
 29 июл. 2014 г., 17:10
У меня может быть странный случай, или я неправильно понял - я рассмотрю более подробно и опубликую вопрос.
 29 июл. 2014 г., 16:08
@Cian Вы либо не поняли ответ, либо делаете что-то не так, либо у вас необычный крайний случай. Вам следует открыть новый вопрос, предоставив как можно больше подробностей и подтверждающих доказательств.

Ваш ответ на вопрос