git clone с поддеревьями - префикс уже существует

У меня есть репо, которое содержит два поддерева в папке "external/".

Когда я клонирую репозиторий, он загружает все файлы, включая код, который я ранее вставил после команды git subtree.

Теперь, если я хочу клонировать это хранилище на другом компьютере и воссоздать структуру поддерева, команда git subtree add завершится неудачно, поскольку папка, в которую я хочу поместить поддерево, уже содержит папку и файлы.

Вот команды, которые я выполнил:

> git clone https://URL/<main>
> git remote add <component> https://URL/<component>
> cd <main>
> git subtree add --prefix external/<component> <component> master
ERROR: prefix 'external/<component>' already exists.

Как это решить? Или есть ли лучший способ воссоздать структуру поддерева для новых операций клонирования?

3 ответа

Суть поддерева Git в том, что вам не нужно ничего "воссоздавать" в другом месте или на другом компьютере. Когда тыcloneрепозиторий, он уже содержит поддерево в виде обычных файлов с помощью обычных коммитов!

Если вы просто хотите "обновить" или "обновить" содержимое поддерева, попробуйте pull.

git subtree pull --prefix external/<component> <component> master

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

git rm -fr external/<component>
git commit -m "Removing old subtree"
git subtree add --prefix external/<component> <component> master

Я хочу сделать то же самое и полностью понять, почему существующие два ответа не принимаются, потому что следующий вопрос/проблема не решена:

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

Что ж, ответ/решение простое. Вы не --

The git subtree addнужно сделать только один раз в репозитории git, во время первого/начального импорта, и никогда не нужно делать это снова. Подробная причина/объяснение здесь.

Итак, в клонированном новом основном репозитории, если вы хотите нажать на поддерево, просто

  1. Повторить git remote addв новом репозитории, который вы делали в старом репо раньше, только один раз в качестве настройки.
  2. Затем нажмите на поддерево так же, как вы делали в старом репо раньше

git subtree push --prefix external/<component> <component> master

Виола! Поддерево git теперь также можно обновить из нового местоположения/репозитория.

Вы получаете ошибку, потому что substree уже существует:

ERROR: prefix 'external/<component>' already exists.

Это связано с тем, что при клонировании основного репо вы также получили код из subtree. При добавлении поддерева в репо вы фиксируете код из внешней ветки / хэша коммита в исходное репо; вы фиксируете источник в своем репо, а не связываетесь с внешним репо. Если / когда вы хотите вставить базу кода в более новую фиксацию из исходного репо поддерева, вы можете выполнить команду:

git subtree pull --prefix external/<component> <component> <branch>

Эта команда втянет HEAD из указанного репо и ветки и помещает код поверх существующего кода в /external/<comonent>путь. После того, как вы выполните этоsubtree команду, вам все равно нужно будет выполнить git commit обновить код.

Ключевое замечание о Git: поддерево отличается от подмодуля тем, что подмодуль создает ссылку / ярлык / ссылку в исходном репо на другое (внешнее) репо. С подмодуль разработчик клонировать репозиторий должен также иметь полномочия / доступ к подмодуль-репо, чтобы тянуть, что связано код в репозиторий быть клонированы. Поддерева является кодом фиксации в корневой репозиторий. Поэтому, если у вас есть доступ к репо, которое вы клонируете, вам не нужен доступ к внешнему репо, указанному в поддереве.

Другие вопросы по тегам