Миграция локального git-репозитория в больший удаленный репозиторий при переписывании путей - PullRequest
5 голосов
/ 22 ноября 2010

Я с удовольствием использую git на своей машине для проекта «MyProject».MyProject на самом деле является частью более широкой совместной исследовательской работы "WholeThing".В WholeThing практически нет совпадений между myProject и OtherProjects.

Теперь Big Bosses решили поместить всю разработку в центральный git-репозиторий (для документации и резервного копирования).Имеет смысл для меня до сих пор.

Предположим, у меня нет привилегированного доступа к центральному хранилищу.

Проблема в том, что MyProject отображается в подкаталог WholeThing, то есть

local repo:
MyProject -|
           |- .git
           |
           |- dirs


remote repo:
WholeThing -|
            |- .git
            |
            |- Area1
            |
            |- Area2
                 |------ MyProject
                 |------ DudesProject

Как мне перевести мой локальный репозиторий в соответствующий подкаталог в центральном репозиториисохранение истории и ветвей?

Я (думаю, я;) понимаю удаленные ветви и прочее, но я еще не нашел способ префиксировать путь к файлу MyProject с помощью «WholeThing / Area2», за исключением перемещения файлов в моем локальном хранилище исоздание коммита до нажатия.Там, безусловно, должен быть другой путь?

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

Любые идеи приветствуются!

Приветствия, Хосе

Ответы [ 3 ]

3 голосов
/ 23 ноября 2010

Спасибо за ответы до сих пор ... заставил меня сформулировать вопрос по-другому в Google.

Ответ на самом деле записан на странице руководства, вам просто нужно прочитать до самого конца.

Решение состоит в том, чтобы переписать историю с помощью git filter-branch и переписать путь каждого файла при этом. Переписать путь в принципе можно с помощью --tree-filter (я думаю) или с --index-filter, что намного быстрее.

Фрагмент кода, приведенный ниже, очень дословно взят из справочной страницы git help filter-branch, только что отредактированной, чтобы отразить каталоги в моем примере. Он запрашивает для каждого коммита имена файлов соответствующего файла, переписывает их с префиксом «WholeThing / Area2 / MyProject /» и воспроизводит коммиты.

git filter-branch --index-filter \
    'git ls-files -s | sed "s-\t-&WholeThing/Area2/MyProject/-" |
     GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
     git update-index --index-info &&
     mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD

Следующий (надеюсь простой) шаг - добавить удаленный репозиторий и вставить в него.

Приветствия и спасибо!

1 голос
/ 09 февраля 2011

да, следующий шаг приятен и прост

git remote add other [path/to/repo]
git fetch other
git checkout -b other-master other/master
git checkout master
git merge other-master

и тебе надо идти

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

В идеале вы должны создать свой собственный подпроект MyProject.git в Wholething / Area2.

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

Правильный способ сделать что-то - это иметь одно git-дерево на проект и т. Д., Поэтому нет .git под WholeThing.При правильном способе «WholeThing / Area2» просто появляется в URL при добавлении удаленной ветви.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...