Подтвердить что ты не робот

Потерянная история git после реорганизации папки проекта

Я сделал фиксацию около месяца назад, в которой я создал новую папку и подпапки и перемещал файлы исходного кода между ними. Я просто просматривал свою историю впервые с тех пор и понял, что git имеет "потерянную" историю, поскольку исходные файлы были удалены, а затем снова добавлены, я полагаю - т.е. когда я просматриваю файл в своем git GUI (он под NDA, поэтому я не могу обсуждать его напрямую, но, к примеру, этот репозиторий также разбит на GitHub. GitHub четко показывает свое обнаружение фиксации как серии ходов.) Он показывает только историю для каждого файла обратно когда папка проекта была реорганизована.

После прочтения нескольких вопросов (Получение git для подтверждения ранее перемещенных файлов, Как сделать знак git удаленный и новый файл в качестве перемещения файла?), я просто потерял больше, чем когда начал. Похоже, что из этих ответов я не смогу это исправить вообще? Я бы очень признателен за любую помощь здесь.

4b9b3361

Ответ 1

В Git нет движения файла.

Некоторые инструменты, такие как GitHub, рассматривают фиксацию, содержащую файл с именем X, который был удален, и файл с именем X, который был создан перемещением файла.

По словам Линуса Торвальдса, перемещение файла - это особый случай рефакторинга; по этой причине Git не будет относиться к нему иначе. Обработка этого специального случая, как и многие другие, предоставляется инструментам более высокого уровня (например, интерфейсам).

Для получения дополнительной информации по этой теме, проверьте этот ответ от Linus Torvalds.

Ответ 2

Пробовали ли настройки config diff.renames?

diff.renames

Сообщает git для обнаружения переименований. Если задано любое логическое значение, оно будет включать базовое обнаружение переименования. Если установлено "копирование" или "копирование", оно также обнаружит копии.

Примечание. Чтобы следить за историей одного файла при переименовании, вам нужно использовать "git log -p --follow file".

Ответ 3

Насколько я вижу, вы хотите:

git log --follow some_file.cpp

Подробнее см. http://git-scm.com/docs/git-log. Я не уверен, что это то, чего вы хотите; но в случае git, git отслеживает контент, а не файлы. Проблема в том, что определение того, что информация действительно дорогая, и предполагается, что она вам вообще не нужна...

Ответ 4

Если вы хотите перемещать папки в git, вы можете использовать git mv.

У меня было множество папок в корневом каталоге моего репозитория и я хотел переместить их в два подкаталога, поэтому я создал два новых каталога, используя ** mkdir.

Затем я перемещал файлы и папки по одному в новые каталоги следующим образом:

git mv folder1/ newDirectory1/
git mv file1.txt newDirectory2/

и др.

У меня был случай, когда я хотел переименовать один из каталогов в src, и я сделал это следующим образом:

git mv folder2 newDirectory1/src

В результате появился набор файлов, которые выглядели следующим образом:

repository/
   newDirectory1/
      folder1/
      src/
   newDirectory2/
      file1.txt

После того, как я закончил, я создал новую ветку с названием "реорганизован", поэтому я не буду вмешиваться в работу, которую другой разработчик делал в главной ветке. Он продолжал работать над файлами, и когда он подтолкнул новые изменения к мастеру, я потянул и объединил изменения в свою ветку, и все работало так, как я надеялся. Файлы, которые были перемещены, были правильно указаны с их исходных мест и получили свои коммиты.

Ответ 5

Если на самом деле у вас отсутствуют версии из вашей истории (это не совсем ясно из вашего вопроса, что на самом деле отсутствует), и это было всего около месяца, у вас, вероятно, еще есть время - посмотрите на reflog; он хранит копию каждой ссылки, которую вы проверили, поэтому, если вы допустили ошибку, вы можете вернуть то, что у вас было раньше.

Значение по умолчанию - хранить записи reflog за 90 дней, срок их действия - git gc.

git help reflog

Ответ 6

Я бы запускал script, который проходит через все объекты. Сначала вам нужно распаковать все файлы пакетов. script будет проверять тип, если это фиксация, вы увидите, являетесь ли вы автором. Затем проверьте дату. Перечислите те и grep для имени файла, которое вы хотите. Когда у вас возникнет заинтересованность, создайте ветку с

git branch RecoveredWork hash-of-your-commit

и посмотрите, есть ли у вас все, что вы хотите, с помощью

git log RecoveredWork --graph --decorate

отсюда вы можете захотеть сделать разветвление фильтра, трансплантацию и/или переработку, чтобы связать историю снова.

Ответ 7

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

Если это не так, вам может потребоваться просмотреть коммит с помощью git log -M -C