2010-10-27 4 views
0

Я импортировал большой репо с использованием ГИТ-p4, и обнаружил, что у меня есть какие-то странно в смешанном регистре имен файлов, например:git-p4 cloned repo содержит смешанное имя файла - как исправить?

dirA/DIRb/file1.txt 

, а затем другие файлы, как так:

DIRa/dirB/FILE2.txt 

и так далее , Они попадают в репо таким образом, потому что git-p4 использует быстрый импорт. Это заставляет Git загадочно утверждать, что есть невоспроизводимые каталоги, которые определенно не отслеживаются, и в них нет новых файлов. Я обнаружил, читая этот вопрос:

git still untracked after add

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

git ls-tree --name-only -r branch 

Я рассматривал возможность использования истории перезаписи, чтобы попытаться это исправить, но это кажется ужасно тяжеловес, и я немного колеблющимся, чтобы пойти туда, если я не должен (дерево - ~ 25K файлов). С другой стороны, я делаю «git status» на чистом дереве и получаю список из примерно 35 «необработанных» путей. Так что это нечестно.

Я могу сделать клон git-p4 с нуля, если нужно, но я подозреваю, что смешанные пути к нему поступают от Perforce. У SmartGit нет этой проблемы с деревом, и копирование точного дерева в новое репо прекрасно работает (поскольку оно добавлено правильно).

Любые идеи о том, как действовать?

Спасибо :)

+0

Я считаю, что это ошибка в git-p4. Я попытался исправить это здесь: https://github.com/larsxschneider/ git/commit/75d75def99ad4d260cb45d402e0e7a2dde4b8e28 Я предложил исправление в список рассылки git. Я обновлю этот ответ, когда исправление будет принято. –

ответ

0

я пошел вперед и попытался git filter-branch --tree-filter "" HEAD, но это ничего не делать. Может быть, есть более красивый способ сделать это с этим, что я пропустил. (Мой ГИТ-фу слаб.)

Это некрасиво, некрасиво, некрасиво, но я нашел, по крайней мере, один из способов сделать это:

  • git-p4 rebase получить все до настоящего времени.

  • Скопируйте .git в другой каталог.

  • Перейдите на этот новый каталог и обновите дерево с помощью git reset --hard.

  • Удалите этот блестящий .git, который вы только что скопировали. Сейчас есть нетронутое дерево с последней регистрацией Perforce.

  • git init и git add -A, затем git commit, чтобы произвести первоначальную регистрацию на новом дереве.Для сообщения совершало, имитировать первоначальную проверку в сообщении GIT-Р4 в:

Initial import of //depot/ from the state at revision #head

[git-p4: depot-paths = "//depot/": change = 58840]

  • обновлените курс 58840 к тому, что было вашего последнего пересмотра ранее, и ваш путь депо к тому, что подходит. (Глядя на журнал фиксации в другом дереве, вы расскажете все, что вам нужно знать.)

  • git gc После этого, если вы не хотите, чтобы вещи были ужасно медленными.

Теперь у вас должно быть базовое дерево без git-p4. Нам также необходимо настроить удаленные ссылки. Я уверен, что есть умный способ сделать это, но я этого не знаю, поэтому я расскажу вам, что я сделал.

  • git log чтобы найти наш импорт. Обратите внимание на свой идентификатор SHA.

  • Посмотрите оригинальное дерево repo's .git/refs. Скопируйте .git/refs/remotes в номер <newrepo>/.git/refs. Измените код refs/remotes/p4/master, чтобы отразить идентификатор SHA вашего HEAD.

Теперь у вас должно быть полностью функциональное репо, которое выглядит как git-p4, как будто оно само проверено, но с последовательным корпусом. Конечно, вы потеряли свою предыдущую местную историю :(Но если вы это сделаете на ранней стадии, это не так уж и важно.

Я не уверен, что проблема со временем вернется, если git-p4 продолжает использовать fast-import, но мое дерево теперь показывается как чистое на git status, когда оно чистое.