git-p4 клонированный репо содержит смешанный регистр имен файлов - как это исправить? - PullRequest
0 голосов
/ 27 октября 2010

Я импортировал большой репозиторий, используя git-p4, и обнаружил, что у меня есть несколько странно смешанных имен файлов, например ::

dirA/DIRb/file1.txt

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

DIRa/dirB/FILE2.txt

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

git все еще не отслеживается после добавления

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

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

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

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

Есть идеи, как поступить?

Спасибо:)

1 Ответ

0 голосов
/ 02 ноября 2010

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

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

  • git-p4 rebase, чтобы получить все в курсе.

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

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

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

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

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 ID.

  • Загляните в дерево оригинального репо .git/refs. Скопируйте .git/refs/remotes в <newrepo>/.git/refs. Отредактируйте refs/remotes/p4/master, чтобы отразить SHA ID вашей головы.

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

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

...